在这个例子中如何将递归转换为尾递归?

时间:2016-11-20 12:28:06

标签: c recursion tail-recursion

我有这个递归函数来添加n个偶数的立方体,我不想把它变成尾递归。

int sum_even_cubes_rec(int n) {
if (n < 2) 
    return 0;
if ((n % 2) == 0) {
    return (n*n*n + sum_even_cubes_rec(n - 1)); 
} else {
    return (0 + sum_even_cubes_rec(n - 1));
}
}

这是我写的,但它错了,我不知道如何解决它。 你能帮我吗?

int sum_even_cubes_rec2(int n, int acc) {
if ((n % 2) == 0) {
    return sum_even_cubes_rec2 (n-1, acc + n*n*n); 
} return acc;
}

int sum_even_cubes_helperFunktion(int n) {
return sum_even_cubes_rec2(n, 0);
}

3 个答案:

答案 0 :(得分:0)

你的方法是正确的。您已经添加了acc参数,因此您需要为基本案例返回。

其余代码几乎正确 - 您需要调整添加到acc的内容以进行下一次调用:

int sum_even_cubes_rec2(int n, int acc) {
    if (n < 2) {
        return acc;
    }
    int nextAcc = (n % 2) == 0 ? acc + n*n*n : acc;
    return sum_even_cubes_rec2 (n-1, nextAcc); 
}

答案 1 :(得分:0)

只需将其写成

即可
int sum_even_cubes_rec2(int n) {
       static int ans = 0;
       if(n<2){
         int tmp =ans;
         ans =0;
         return tmp;
       }
       ans += ( (n%2==0)? n*n*n : 0 );
       return sum_even_cubes_rec2(n-1);
}

答案 2 :(得分:0)

int sum_even_cubes(int n) {
    int ret =0;

    if (n < 2) return 0;

    ret = (n % 2) ? 0: n*n*n;
    return ret + sum_even_cubes(n-1); 
}

Gcc -O2 -S将其编译为(函数参数为%edi;返回值为%eax;递归循环的目标为.L4):

sum_even_cubes:
.LFB0:
        .cfi_startproc
        xorl    %eax, %eax
        cmpl    $1, %edi
        jle     .L5
        .p2align 4,,10
        .p2align 3
.L4:
        xorl    %edx, %edx
        testb   $1, %dil
        jne     .L3
        movl    %edi, %edx
        imull   %edi, %edx
        imull   %edi, %edx
.L3:
        subl    $1, %edi
        addl    %edx, %eax
        cmpl    $1, %edi
        jne     .L4
        rep ret
.L5:
        rep ret
        .cfi_endproc
.LFE0: