【发布时间】:2018-09-01 16:46:38
【问题描述】:
我最近开始尝试学习 C 并且正在做一个涉及创建递归阶乘函数的练习。 为什么下面会打印出 24 的答案?
#include <stdio.h>
int factorial(int n);
int main(void)
{
int n = 5;
printf("%d\n", factorial(n));
return 0;
}
int factorial(int n)
{
if (n <= 1)
return 1;
else
return n * factorial(--n);
}
如果我将最后一行更改为
返回 n * 阶乘(n - 1);
我得到了预期的 120。
我知道您不能使用 n-- b/c 它只会在处理完行后减少 n 但 --n 有什么问题&为什么它给出 24?
【问题讨论】:
-
--n更改变量 n,n-1没有,在您的情况下使用n-1 -
这个程序导致未定义的行为,任何事情都可能发生
-
如果您已经开始学习 C,那么还要注意,递归的使用应仅限于程序解决方案不存在的情况,或者过长或难以实施的情况。为什么?因为每个递归调用都是一个单独的函数调用,需要它自己的函数堆栈。对于
factorial,这很好,但是如果您启动数万或数十万或更深的递归,您可能会迅速耗尽资源。谨慎使用它们。 -
@M.M - 您指的是“
n的值是多少?”在return n * factorial(--n); -
引用是C11 Standard - 6.5 Expressions(p2) "如果标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值的值计算是无序的标量对象,行为未定义。”
标签: c decrement unary-operator