我有一个像这样的递归函数:
public static int h(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
} else {
//variable value is a fixed one.
i = value % 2;
return h(n - h(i) - 1) + h(n - 2);
}
}
假设此时变量value
的值是偶数。然后如果我用h(12)
调用该函数,我想知道函数是如何工作的?
在这种情况下,我想要发生的是评估
h(12)=h[12-h(0)-1]+h(10)
=h(11)+h(10)
={h(11-h(0)-1)+h(9)}+{h(10-h(0)-1)+h(8)}
={h(10)+h(9)}+{h(9)+h(8)}
在评估h(11)+h(10)
时,函数首先完成h(11)
并在开始使用h(n-2)
之前获取该值,这是h(10)
。
如果它首先完成h(11)
,那么最后它必须达到n == 0或n == 1 case.Then到达时不会h(n-2)
成为h(-2)
}或h(-1)
。
如何将初始函数调用值存储为12,当它到达h(n-2)
时调用h(10)
,然后使该部分计算为h(8),h(6)..
答案 0 :(得分:2)
每个函数调用都存储自己的参数副本。因此,在第一次通话(h(11)
)中,致电n
不会更改h(12)
。
Java中的表达式从左到右进行评估。这意味着调用h(11)
将在h(10)
调用h(12)
之前完成。但是,在这种情况下,这并不重要,因为结果将是相同的。