双尾递归需要说明

时间:2015-01-12 10:01:30

标签: c recursion return return-value

我在两次return语句中遇到了这个递归。有人可以一步一步地给我结果吗?

caos(9);

int caos( int n ) {
    if (n < 4) {
        return n;
    } else return caos(n-2) + caos(n-4);
}

2 个答案:

答案 0 :(得分:2)

根据我的评论,我不会给你一个完整的解决方案,但我会尝试用你可以开始的东西来帮助你。

让我们来caos(9)

                         caos(9)    9 < 4? no
                       /         \   
                      /           \
      7 < 4? no  caos(7)          caos(5)  5 < 4? no
                 /    \           /     \
                /      \         /       \
   5 < 4? no caos(5)   caos(3)  caos(3)  caos(1)
             /   \          ↑        ↑        ↑
           ..    ..      all are < 4, let's go up!
                       remember the stop condition. It returns n

答案 1 :(得分:1)

我认为,首先需要了解的是return声明。

作为参考,来自C99标准文件,第6.8.6.4章,第3段,

  

如果执行带有表达式的return语句,则表达式的值将作为函数调用表达式的值返回给调用者。

因此,当遇到return caos(n-2) + caos(n-4);语句时,caos()将被调用[再次,这是递归],其值为n-2n-4作为参数。< / p>

现在,对于caos()函数本身,

  • 如果n值为< 4,则会执行return 4
  • 否则,它将执行return caos(n-2) + caos(n-4);

以上解释了后者的效果。希望这可以帮助。