递归函数

时间:2010-12-17 04:54:34

标签: c recursion

鉴于以下递归函数,mysterious(4)会打印什么?

void mysterious(int x) {
    if (x == 0) return;
    printf(“%d ”, x);
    mysterious(x-1);
    mysterious(x-1);
}

这是我的调用堆栈:

mysterious(4) => print 4
mysterious(3) => print 3
mysterious(2) => print 2
mysterious(1) => print 1
mysterious(0) => print 0

这是对的吗?

4 个答案:

答案 0 :(得分:7)

因为每个函数调用依次进行2个函数调用,所以你可以将你的递归可视化为“树”,并且你正在树上进行前序遍历。

它看起来像这样:

                           4
                           |
                3----------+----------3
                |                     |
           2----+----2           2----+----2
           |         |           |         |
        1--+--1   1--+--1     1--+--1   1--+--1

您拥有的执行顺序是:

  • 打印号码
  • 使用x-1
  • 调用该函数
  • 再次使用x-1调用该函数

这通过以下方式对应于我们的“树形可视化”:

  • 打印根
  • 遍历左侧节点
  • 遍历右侧节点

输出结果为:

    4 3 2 1 1 2 1 1 3 2 1 1 2 1 1

答案 1 :(得分:5)

为什么不用您选择的语言将其输入编辑器,编译并运行?我之所以选择Java,那只是因为我现在正在我的盒子上安装CygWin - 我宁愿使用C: - )

public class testprog {
    public static void mysterious(int x) {
        if (x == 0) return;
        System.out.print(x + " ");
        mysterious(x-1);
        mysterious(x-1);
    }
    public static void main(String args[]) {
        mysterious(4);
    }
}

输出数字:

4 3 2 1 1 2 1 1 3 2 1 1 2 1 1

基本上,正在发生的事情是,在每个级别,你打印出数字,然后用下一个最小的数字调用下一个级别两次(除非它达到零)。

  

除此之外:从技术上讲,你用零调用下一层,但是,因为它立即返回,它对输出没有影响。

下图有望更好地说明这一点,不同的符号代表不同的层:

(4) (-------------------------------) (-------------------------------)
     {3} {-----------} {-----------}   {3} {-----------} {-----------}
          [2] [1] [1]   [2] [1] [1]         [2] [1] [1]   [2] [1] [1]

答案 2 :(得分:2)

不,它将是

mysterious(4) => print 4
mysterious(3) => print 3
mysterious(2) => print 2
mysterious(1) => print 1
mysterious(1) => print 1
mysterious(2) => print 2
mysterious(1) => print 1
mysterious(1) => print 1
mysterious(3) => print 3
mysterious(2) => print 2
mysterious(1) => print 1
mysterious(1) => print 1
mysterious(2) => print 2
mysterious(1) => print 1
mysterious(1) => print 1

因为0会导致函数提前返回,因为该双重调用。

答案 3 :(得分:1)

没有。当0将返回时,它不会打印x==0

此外,因为你有

mysterious(x-1);
mysterious(x-1);

它将打印(固定)

4 3 2 1 1 2 1 1 3 2 1 1 2 1 1

mysterious(x-1);不会更改x的值。它只需再次调用mysterious(),这次使用值x-1