私は、再帰的な解決策を問題とその反復的な対応物と比較することを含む宿題の問題に取り組んでいます。現在、指定された値のセットに対して再帰関数が機能していますが、反復バージョンは最後の値以外のすべての値に対して機能するようで、奇妙に思えます。
反復関数は次のとおりです。
uint64_t
normalPower(uint64_t k, uint64_t n, uint32_t m)
{
uint64_t answer = 1;
for (int i = 1; i <= n; i++)
{
answer = answer * k % m;
}
return answer;
return EXIT_SUCCESS;
}
他の関連情報は
uint64_t n;
for (int i = 0; i <= 10; i++)
{
n = n * 10;
}
と
uint64_t k = 1835;
uint32_t m = 590623782;
再帰関数を実行すると、他のクラスメートと確認した最終値の答え 424171147 が得られます。アルゴリズムが以前のすべての値では機能するのに、最終的な値では機能しない理由について、私は混乱しています。どんな助けでも大歓迎です。
余談ですが、反復バージョンが非常に非効率的であることは認識しています。これが割り当てのポイントです。
ここで要求されているのは再帰関数です
uint64_t
fastPower(uint64_t k, uint64_t n, uint32_t m)
{
uint64_t answer = 0;
if (n % 2 == 0 && n > 1)
{
uint64_t kn = fastPower(k, n / 2, m);
answer = (kn * kn) % m;
return answer;
}
else if (n > 1)
{
answer = fastPower(k, 1, m) * fastPower(k, n - 1, m) % m;
return answer;
}
else
answer = k % m;
return answer;
return EXIT_SUCCESS;
}
また、n は宣言時に 1 として初期化されます。