递归:一次返回

Recursion: double call in one return

本文关键字:一次 返回 递归      更新时间:2023-10-16
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)",我会知道如何思考,但是有两个电话。谢谢!

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

如果您以每个步骤的一个操作转动此操作,则可以得到类似的东西:

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