0

助けが必要です。私はc++で再帰関数を持っています。これは、文字列(すべての数値)を単純に分解し、文字を合計して、合計が9未満かどうかを確認します。そうでない場合は、条件が満たされるまで再度呼び出します。これまでのところ、私の条件が満たされる最後まで機能しているものはすべて、もう一度関数を呼び出します。これは明らかに、私が割り当てようとしている変数の値を台無しにします。多くの参考文献を参照しましたが、構文が正しいようですか?私の関数が最後に自分自身を呼び出す理由についての助け。

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

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.
}

私は、リターンをelse {}に入れてから、if else条件を交換して、リターンが私のifに含まれるようにするまで、すべてを試しました。どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

2

条件内のステートメントは次のようにすべきではありません。

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

それ以外の場合は、電話をかけているだけです

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

これは何もしません (つまり、最終的な出力には寄与しません)。

于 2012-04-23T20:28:49.477 に答える
1

このコメントをもとに

プログラムが自動的に 2 行ジャンプする

デバッガーでこれを確認することをお勧めします。2行上にジャンプすること自体は正しいです-関数スタックを上に移動します(つまり、あなたのものを呼び出した関数に戻ります-そして再びですsumTotal)。それで、すべてが完了した後、機能が本当に最初から始まると確信していますか?

考慮すべきもう 1 つの点: の初期値がsumInputToString10 未満の場合、コードはとにかく実行されます。本当に欲しいですか?

そして、あなたの質問に直接関係のないアドバイスはほとんどありません。関数が実際に何をすべきかを理解することは非常に困難です。複雑なアルゴリズム (再帰を使用するため、これは複雑と見なされる場合があります) については、適切な関数コメントが必要です。私は次のようなことを提案します:

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

なぜそれが必要なのかという短い文を含めることもできます (一見すると奇妙に思えるかもしれません)。

この関数は、ある数が 3 で割り切れるかどうかを調べるために使用できます。

このようなコメントを書いた後、ロジックがどうあるべきかを理解し始め、ここでは再帰が必要ないことに気付くかもしれません。そして、コードを次のように変換します。

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

    return val;
}
于 2012-04-24T07:35:39.290 に答える