鉴于以下递归函数,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
这是对的吗?
答案 0 :(得分:7)
因为每个函数调用依次进行2个函数调用,所以你可以将你的递归可视化为“树”,并且你正在树上进行前序遍历。
它看起来像这样:
4
|
3----------+----------3
| |
2----+----2 2----+----2
| | | |
1--+--1 1--+--1 1--+--1 1--+--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