0

だから私はこの問題の解決策を見つけようとしましたが、私のプログラムは非常に奇妙な動作をしています.

#include <iostream>
using namespace std;

int triangle_numbers(int n, int meh = 0)
{
    int count = 0;

    //calculate how many divisors there are for meh
    for(int i = 1; i <= meh; i++)
        if(meh%i == 0)
            count++;

    //if the number of divisors for meh is over 500, return meh
    if(count > 500)
        return meh;

    //recursive call to increment n by 1 and set meh to the next triangle number
    triangle_numbers(n+1, meh += n);
}

int main()
{
    int cc = triangle_numbers(1);
    cout << cc << endl;
}

出力mehしてcount個別に正確な結果が得られると、たとえばif(count > 10). 再帰呼び出しに関係があるのではないかと感じていますが、これまでに試したことはすべてうまくいきませんでした。何か助けはありますか?

4

1 に答える 1

3

再帰を完了するために必要な最後のreturnステートメントがありません(コンパイラーはtriangle_numbers、すべての場合に実際に何かを返すわけではないことを警告しませんか?)。

の最終値mehが計算されたら、次のことを行う必要があります。

return triangle_numbers(n+1, meh += n);

これによりmeh、コールスタックに戻って、最後にに戻ることができますmain

現在表示されている数値は、再帰が終了した後にスタックに残っている値である可能性があります。

補足:このアルゴリズムの古典的な最適化は、i最大で反復することmeh / 2ですが、それ以上は繰り返さないことです。明らかに、の半分を超える数はそれをmeh均等に分割できないため、スキップできます。

于 2012-08-16T21:57:34.233 に答える