2016-12-01 10 views
2

私はfunct()を割り当てられ、末尾再帰に変換するように指示されたので、funct2()を作成しました。私は別のスタックオーバーフローthreadを使用して開始し、それは作品の種類、それは常にオフの値です。私の末尾再帰を修正する方法は分かりません(元々は定期的再帰)

私は問題が原因初期値は0であることY値にあり、かつ機能の他に部分に行くとき、ではなく、初期に相当する値から減算考えるx。確信はないけど。

#include <iostream> 
#include <stdio.h> 
using namespace std; 
int funct(int x); 
int funct2(int x, int y); 

int main() { 

    int x = 24; 

    printf("%d %d", funct(x), funct2(x, 0)); 


} 

int funct(int x) { 

    if (x <= 0){ 
     return 0; 
    } 
    else if (x & 0x01){ 
     return x + funct(x-1); 
    } 
    else { 
     return x - funct(x-1); 
    } 

} 

int funct2(int x, int y) { 

    if (x < 0){ 
     return 0; 
    } 
    else if (x == 0){ 
     return y; 
    } 
    else if (x & 0x01){ 
     return funct2(x-1, y+x); 
    } 
    else { 
     return funct2(x-1, y-(x-1)); 
    } 

} 

助けていただければ幸いです。みんなありがとう!

+0

テール再帰はCの言語レベルの機能ではないので、コンパイラがテールコールのスタックレベルを上げないように気をつけてください...特定の最適化になります。あなたがgotoとラベルでそれを書いていない限り... Cレベルの構造、悪、邪悪なコンストラクトです。 –

答えて

1

this great explanationをご覧ください。あなたの再帰的ステップは結合的ではないので、あなたは2つの引数だけでテール再帰を達成することはできません。

int tailrec(int x, int k, int acc) 
    { 
     if (x < 0) { 
      return acc; 
     } 
     if (k & 0x01) { 
      return tailrec(x - 1, k + 1, k + acc); 
     } else { 
      return tailrec(x - 1, k + 1, k - acc); 
     } 
    } 
関連する問題