int f(int n){
if (n==0 || n==1)
return 1;
else
return 2*f(n-1)+2*f(n-2);
}
如果n = 3,您如何看待这个步骤? 如果只有一个“2 * f(n-1)”,我会知道怎么想,但有两个电话。 谢谢!
答案 0 :(得分:0)
<强> QED 强>
n = 3
的调用图应为:
=> 2*f(2)+2*f(1);
=> 2*[2*f(1)+2*f(0)] + 2*f(1)
=> 2*[2*1 + 2*1] + 2*f(1)
=> 8 + 2*1
=> 10
答案 1 :(得分:0)
如果你按照每步的一个操作来解决这个问题,你会得到类似的结果:
int f(int n){
return fcont1(n, n < 2);
}
int fcont1(int n, int nl2) {
if( nl2 ) {
return n;
} else {
return fcont2(n);
}
}
int fcont2(int nm1){
return fcont3(n, n-1);
}
int fcont3(int n, int nm1){
return fcont4(n, f(nm1));
}
int fcont4(int n, int r1){
return fcont5(r1, n-2);
}
int fcont5(int r1, int nm2){
return fcont6(r1, f(nm2));
}
int fcont6(int r1, int r2) {
return fcont7(2*r1, r2);
}
int fcont7(int dr1, int r2) {
return fcont7(dr1, 2*r2);
}
int fcont7(int dr1, int dr2) {
return dr1+dr2;
}
对于coruse,这个重写最终会使用更多的内存,因为C不会优化尾调用,但是执行此操作的任何语言都与所确定的操作顺序完全相同。