使用参数递归的数字阶乘(如参数列表中的函数调用)
factorial of number using argument recursion(as in function call within argument list)
我的问题是关于在 c 中使用三元运算符求一个数的阶乘。我下面的代码建议使用递归,不是函数定义,而是参数列表。这在 c 中有效吗?
[注意:0 阶乘由一段单独的代码处理]
fact 的函数原型是:
int fact(int);
定义为:
int fact(num=(num>1)?num*fact(num-1):1)
{
return num;
}
我的问题是,就像在函数内调用同一函数的不同实例的递归一样,对于参数也是如此吗?
你想要这个:
int fact(int num)
{
return num > 1 ? num*fact(num-1) : 1;
}
这里有几种方法[它们将编译成几乎相同的——non-recursive 版本除外]:
// this is as close as you can come
int
fact(int num)
{
return ((num>1) ? num*fact(num-1) : 1);
}
// this also works
int
fact(int num)
{
if (num > 1)
num = num * fact(num-1);
return num;
}
// this also works
int
fact(int num)
{
if (num > 1)
num *= fact(num-1);
return num;
}
// non-recursive version
int
fact(int num)
{
int i;
int fac;
fac = 1;
for (i = 2; i <= num; ++i)
fac *= i;
return fac;
}
我应该提一下 non-recursive 版本执行速度更快。忽略 large 阶乘可能会溢出 int
(即 long long
可能是更好的选择),在递归版本上尝试 fact(100000000)
然后你'由于堆栈溢出,很可能会出现段错误。但是,non-recursive 会处理得很好。
这不是一个有效的语法,编译器会报错,因为你在参数区域中编写代码实现。实现必须在函数签名后的大括号范围内
有效语法示例:
long factorial(int n);
// some code
long factorial(int n)
{
if (n == 0)
return 1;
else
return(n * factorial(n-1));
}
参考:http://www.programmingsimplified.com/c-program-find-factorial
我的问题是关于在 c 中使用三元运算符求一个数的阶乘。我下面的代码建议使用递归,不是函数定义,而是参数列表。这在 c 中有效吗?
[注意:0 阶乘由一段单独的代码处理]
fact 的函数原型是:
int fact(int);
定义为:
int fact(num=(num>1)?num*fact(num-1):1)
{
return num;
}
我的问题是,就像在函数内调用同一函数的不同实例的递归一样,对于参数也是如此吗?
你想要这个:
int fact(int num)
{
return num > 1 ? num*fact(num-1) : 1;
}
这里有几种方法[它们将编译成几乎相同的——non-recursive 版本除外]:
// this is as close as you can come
int
fact(int num)
{
return ((num>1) ? num*fact(num-1) : 1);
}
// this also works
int
fact(int num)
{
if (num > 1)
num = num * fact(num-1);
return num;
}
// this also works
int
fact(int num)
{
if (num > 1)
num *= fact(num-1);
return num;
}
// non-recursive version
int
fact(int num)
{
int i;
int fac;
fac = 1;
for (i = 2; i <= num; ++i)
fac *= i;
return fac;
}
我应该提一下 non-recursive 版本执行速度更快。忽略 large 阶乘可能会溢出 int
(即 long long
可能是更好的选择),在递归版本上尝试 fact(100000000)
然后你'由于堆栈溢出,很可能会出现段错误。但是,non-recursive 会处理得很好。
这不是一个有效的语法,编译器会报错,因为你在参数区域中编写代码实现。实现必须在函数签名后的大括号范围内
有效语法示例:
long factorial(int n);
// some code
long factorial(int n)
{
if (n == 0)
return 1;
else
return(n * factorial(n-1));
}
参考:http://www.programmingsimplified.com/c-program-find-factorial