2012-04-23 17 views
0

私は助けが必要です。私は、単純に文字列(すべての数値)を分割し、その合計が9未満であるかどうかを調べる文字を追加するC++の再帰関数を持っています。これまでのところ、私の条件が満たされたときに終わりまで機能しているすべてのものは、もう一度関数を呼び出します。これは明らかに私がそれを割り当てようとしている変数の値を混乱させます。私は多くの参照を参照し、私の構文が正しいようですね?私の関数がなぜ自分のものを最後に呼び出すのかに関する助け。条件が満たされるとC++再帰関数が終了しない

///////////////////////////////////////////////////////////////////////////// ///////////

int finalNumber =0; 

// set finalNumber 

finalNumber = sumTotal(sumInput); 

int sumTotal(int sumInputToString) 
{ 

    stringstream strToInt; 
    string convertedInt; 

    strToInt << sumInputToString; 
    convertedInt= strToInt.str(); 

    int sum = 0; 

    for(int i = 0; i < convertedInt.length(); i++) 
    { 
     sum += (int)convertedInt[i] - 48; 
    } 

    if (sum > 9) 
    { 
     sumTotal(sum); 
    } 
    return sum; //ONCE SUM IS LESS THAN 9,which is what i want, 
       //MY PROGRAM AUTOMATICALLY JUMPS UP TWO LINES does it one 
       //more time than it will escape. 
} 

私は他に私の復帰を入れて{}と私のリターンが私の場合になりますので、私の場合は他の条件をスワップからすべてを試してみました。どんな助けでも大歓迎です。

ありがとうございました。

+0

@ahenderson - それは逃げるモードですべてを行います。 BTW - 再考を避けてください。通常は涙で終わります –

+0

あなたは、プログラムが間違った価値を持って終了するか、ちょうど立ち往生していると言っていますか?値が10より小さい場合、それをもう一度呼び出すと、結果を変更してはなりません。 –

答えて

2

は、条件内の文はすべきではありません:

if (sum > 9) 
{ 
    sum = sumTotal(sum); 
} 

そうしないと、あなただけの(すなわち、最終的な出力に寄与しない)何もしないその

if (sum > 9) 
{ 
    sumTotal(sum); 
} 
return sum; 

を呼んでいます。

+0

これが終了に影響しますか? –

+0

@ ZiyaoWei返される数値に影響します。 –

+0

ええ、私は知っている:)もう一つのバグ。編集:私はちょうどOPは終了について何も言わなかったことに気づいた。 –

1
このコメントに基づいて

MYプログラムが自動的に私はあなたがデバッガでこれを見る提案することができる二行

をUPジャンプします。 2行上をジャンプすることは正しいです - あなたは関数スタック上に移動します(つまり、あなたの関数を呼び出した関数に戻ります - それは再びsumTotalです)。だから、あなたはすべてが終わった後、機能は本当に最初から始まると確信していますか?

もう1つ考えてください:sumInputToStringの初期値が10未満の場合、コードはとにかに実行されます。あなたは本当にそれをしたいですか?

あなたの質問に直接関係しないアドバイスはほとんどありません。あなたの関数が本当に何をすべきかを理解することは非常に難しいです。任意の複雑なアルゴリズム(これは再帰を使用するため複雑であると考えられます)では、適切な関数コメントが必要です。

この関数は、指定された 番号のすべての桁の合計を最初に計算します。結果が9以下であれば返されます。そうでない場合は、 この合計を所定の数値として処理します。

この機能は、いくつかの数が3で割り切れるかどうかを把握するために使用することができます(それは一見奇妙に思えるかもしれないので)

あなたはまた、短いsentenseを含むこともできるが、なぜあなたはそれが必要なのですかか否か。

このようなコメントを書き留めた後は、ロジックが何であるべきかを理解し始めており、ここで再帰を必要としないことが分かります。そして、あなたのコードを次のようなものに変換してください:

// Function comment 
int CalculateRecursiveSumOfDigits(int val) { 
    while (val > 9) { 
     val = CalculateSumOfDigits(val); // TODO: implement this function 
    } 

    return val; 
} 
関連する問題