2016-10-20 14 views
0

次のように再帰関数を作成しようとしています。再帰的なC++関数

関数はカウンターkをとり、限りカウンタがゼロより大きいことを、私は最後に、私はこのようなもので終わるように再帰的にそれを呼び出すしたいと思います:

result = 2(2(2n+1)+1)+1 

最後n(k = 0の場合)はゼロでなければならない。

int pass(int k, int n) 
{ 
    if(k==0) 
    { 
     n = 0; 
    } 
    else 
    { 
     k--; 
     return pass(k, 2*n+1); 
    } 
} 

誰かが私にどのようにヒントを与えることができますか?

+3

この再帰では基本ケースが必要です。 k == 0なら、nだけでなく0を返すべきです。 – code11

+3

'k == 0 'の場合、関数は' return'ステートメントなしで返します。これは未定義の動作を引き起こします。 – Peter

+0

私は0を返すように変更しましたが、それでも動作しません。 – DoubleOseven

答えて

4

変更

n = 0; 

結果を返します。

残りのコードは正常です。

+0

ありがとうございます:) – DoubleOseven

2

現在、すべてのコントロールパスで明示的に値を返さないため、コードの動作は未定義です。私は三項条件演算子を使用しました。ここ

int pass(int k, int n) 
{ 
    return k ? 2 * pass(k - 1, n) + 1 : 1; 
} 

あなたのコードはまで簡素化することができます。 kがゼロでない場合は2 * pass(k - 1, n) + 1が返され、それ以外の場合は1が返されます。

この場合、intがオーバーフローしないように注意してください。 intの最大サイズは32767と小さくてもかまいません。代わりにlongタイプを使用することを検討してください。

また、通常、再帰はO(n)型の問題を解決する良い方法ではありません。関数呼び出しのスタック制限を超えているため、実行時にエラーが発生する可能性があります。代わりにループに折り畳むことを検討してください。

return n; 

+0

これは私にとっては簡単なことですが、あなたと他のプログラマは、まだ三項演算に精通していない人にとってはもっとシンプル(読める)ではないかもしれません。 –

+0

私はちょうどテンプレートを使って解決策を提出しようとしていました;-) – Bathsheba

+0

@TimBeaudetそれでは、三項演算子に慣れるべき時です。私は式の単純化によってもっと困惑しています... – user463035818