2017-07-27 6 views
0

私は、次のように、再帰関数を持ってここで、b> = 0この再帰関数は何回繰り返されますか?

def multiply(a,b): 
    if b == 0: 
     return 0 
    elif b % 2 == 0: 
     return multiply(2*a, b/2) 
    else: 
     return a + multiply(a, b-1) 
私は関数はという点aとbで を実行する回数を知っていただきたいと思い

。おかげさまで

+0

このメソッドは壊れています。たとえば、 'multiply(1、0)'を試してみてください。無限回帰ループがあります。 – Jesper

+0

ええ、私はタイプミスをしました。今修正されました。 – alexcons

+0

ヒント:bのバイナリ表現を使用し、次のmultiply()コールで使用されるチェック値を使用します。 – Ante

答えて

0

私はここで間違っているかもしれませんが、あなたの機能は意図した通りに機能しないと思います。再帰では、プロペラの終了基準として最も重要なことは、それが永遠にelsewaysで実行されるためです。

終了基準はa==0ですが、各再帰呼び出しでは、aを減らしません。単に&という紙のシミュレーションをa = 5で行い、それがいつでも停止するかどうかを確認してください。

+0

申し訳ありませんが、私はベースケースでタイプミスをしたことに気付きました。私はそれを更新しました。 – alexcons

+0

あなたはそれを理解しましたか? – alexcons

+0

今仕事中、夕方に見せる時間があるかもしれません。しかし、私はあなた自身もそれをやることができると思います!アルゴリズムのアプローチを使用して再発を解決してみてください。 これは私が考えると非常に役に立つかもしれません:http://www.geeksforgeeks.org/analysis-algorithm-set-4-master-method-solving-recurrences/ –

1

bのバイナリ表現(Bと呼ぶ)が1で終わる場合、xxxx1のように乗算の次の呼び出しはB = xxxx0です。

Bが0で終わる場合、Bの次の値よりもxxxx0の方がxxxxです。

これでbのバイナリ表現の数字は、0の場合は1つのコールを追加し、1の場合は2つのコールを追加します。合計コール数がlength of initial B + number of ones in initial Bに等しいことを合計します。

関連する問題