以下递归如何输出48?

时间:2015-03-24 17:28:06

标签: c recursion output

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;
}

1 个答案:

答案 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