2016-11-20 7 views
2

私はこの偶数のキューブを追加するためにこの再帰関数を持っており、テール再帰にすることは望ましくありません。この例では、再帰を末尾再帰に変換する方法はありますか?

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); 
} 
+1

追加この '場合(N <2)戻り0;'として、リターンsum_even_cubes_rec2(N-1、ACC) 'へのコードの最初の行として'この最後の行であなたのコード –

答えて

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); 
} 
+2

から 'return acc'を取り除いて、あなたが末尾の再帰を持っていると、あなたかコンパイラはそれをループに変えることができます(再帰呼び出しを排除します)。 –

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); 
} 
+0

はい、これは末尾再帰関数ですが、初めて実行するときにのみ機能します。 2回目以降は 'static'を使うので間違った結果を返します。 – dasblinkenlight

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、戻り値はです)。;再帰ループのための標的)は.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: 
関連する問題