C输出48中的以下递归如何? 我期望输出为0。
#include<stdio.h>
int fun(int i) {
if(i<2)
return 1;
else {
return fun(--i) * i * fun(--i);
}
}
int main() {
printf("%d",fun(5));
return 0;
}
答案 0 :(得分:2)
表达式fun(--i) * i * fun(--i)
表现出未定义的行为。所以我们不能对会产生什么做出任何假设。如果您对未定义的原因感到好奇,请阅读:Why are these constructs (using ++) undefined behavior?
我们可以尝试删除未定义的行为,并谈谈:
int fun(int i) {
if(i<2)
return 1;
else {
return fun(i - 1) * (i - 1) * fun(i - 2);
}
}
fun(5)
应该并且确实使用更正后的代码生成48。如果我们需要证明......
fun(0) == 1
fun(1) == 1
fun(2) == fun(1) * 1 * fun(0) == 1 * 1 * 1 == 1
fun(3) == fun(2) * 2 * fun(1) == 1 * 2 * 1 == 2
fun(4) == fun(3) * 3 * fun(2) == 2 * 3 * 1 == 6
fun(5) == fun(4) * 4 * fun(3) == 6 * 4 * 2 == 48