2013-02-09 78 views
1

我正在尝试在C中重新编写这个bash函数,但有点不确定如何将此函数转换为C循环。转换一个Bash函数来计算n!到C?

这里我有变量集。这我已经有

n=10 
r=4 

这是我如何重新写这个有点失落。这似乎是用自己的函数调用函数,我非常确定C不会这么做(至少安全),而且它不需要是一个函数,我只需要插入相同的变量,并让它来与同样的结果出来。

factorial() { 
if (($1)); then 
    echo $(($1 * $(factorial $(($1-1))))) 
else 
    echo 1 
fi 
} 

最后一点,在C中表达下面代码的最佳方式是什么? bash中的包围会继续吗?

result=$(($(factorial $n)/($(factorial $r)*$(factorial $(($n-$r)))))) 
+0

阶乘工作在标准整数类型的这么少输入整数的范围,我会只是做一个查找表,而不是计算循环。无论如何,你必须检查用户输入是否在界限内。 – 2013-02-09 10:30:49

回答

3

这是完全合法的C函数调用自己 - 这就是所谓的recursion。在C,它应该是这样的:

int factorial(int n) { 
    if (n == 0) return 1; 
    return n * factorial(n - 1); 
} 

你也可以直接写为一个循环:

int factorial(int n) { 
    int result = 1; 
    for (int i = 1; i <= n; i++) { 
     result *= i; 
    } 
    return result; 
} 

希望这有助于!

+0

非常非常!谢谢! – user1787331 2013-02-09 05:06:11

0
int factorial(int i) 
{ 
    if(i) 
     return factorial(i - 1) * i; 
    return 1; 
} 

int main() 
{ 
    printf("%d", factorial(5)); 
    return 0; 
} 
+0

不应该是'int main()'?或者是'void main()'合法的C? – templatetypedef 2013-02-09 05:02:31

0

因为它涉及很少的函数调用开销,所以我更喜欢non_recursive版本,但他们都应该工作。 我不知道bash如何处理巨大的数字,不幸的是,在C语言中long double是您可以在不使用外部库的情况下获得的最大范围。

long double recursive (int n) { 
    if (n <= 1) 
    return 1.0; 
    else return (n * recursive (n-1)); 
} 

long double non_recursive (int n) { 
    long double value = 1.0; 

    while (n > 1) 
    value *= n--; 

    return value; 
} 

要回答你的第二个问题,我建议如下数学变换计算之前,做足不必要的计算开销:

n!    (M+1) * (M+2) * ... * n 
----------- = ------------------------ 
r! * (n-r)!    (n-m) ! 

        with M = max (r, n-r), m = min (r, n-r); 

鉴于这种转变相应的C代码是这样的:

long double over (int n, int r) { 

    int M; 
    int m; 

    if (r > n-r) { 
    M = r+1; 
    m = n-r; 
    } 
    else { 
    M = n-r + 1; 
    m = r; 
    } 

    long double value = 1.0; 

    while (M <= n) 
    value *= M++; 

    while (m > 1) 
    value /= m--; 

    return value; 
}