递归:一次返回双重调用

时间:2017-09-16 12:32:05

标签: c++ recursion

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)”,我会知道怎么想,但有两个电话。 谢谢!

2 个答案:

答案 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不会优化尾调用,但是执行此操作的任何语言都与所确定的操作顺序完全相同。