2012-05-10 16 views
0

正の整数nの数字のbの数字のリストを返す再帰関数dec2base(n, b)を書く必要があります。例えば。私の再帰関数が間違っているのはなぜですか?

dec2base(120, 10) => [1,2,0] (1 * 10**2 + 2 * 10**1 + 0 * 10**0) 

現在、私は持っています。

def dec2base(n, b): 
    if n < 10: 
     return [n] 
    else: 
     return dec2base(n, b) + [n%b] 

ただし、プログラムを実行すると、無限ループエラーが返されます。何か案は?

+0

のように、わずかにそれを簡素化し、それを実行見ることができます。あなたが間違っている場所を知るのに役立ちます。 – sdolan

答えて

0

あなたの電話番号はdec2base(n, b)から無限大です。お電話の場合

dec2base(20, b) 

この機能は、if/elseステートメントの2番目のブランチを引き続き実行します。最終的にn < 10がTrueと評価されるように、再帰関数呼び出しに値を減らす必要があります。

+0

私はn-1を試みましたが、それは間違った答えを与えます。私はnの数学的なスタイルのことをやっている必要がありますか? – Hoops

+0

Do 'n // b'。また、ifステートメントは意味をなさない。 'dec2base(10,2)'は[5、0]を返しますが、これは間違っています。あなたが欲しいのは 'n

+0

ありがとうございました! – Hoops

3

メソッドの任意のポイントでnの値を減らさないので、n> = 10の任意の値で開始すると、ループは終了しません。

もう1つの観察 - "n < 10 return [n]"の論理は、bが10と等しくない場合には意味がないようです。たとえば、ですが、dec2baseの値を仮定しています9,2)はない[9]。 [1,0,0,1]になります。

2

いいえ、任意の再帰関数では、何かを停止させるためにゼロになる関数がなければなりません。この場合は、あなたが欲しいのは本当にyou7は手でそれを行う方法をモデル化することである:

  • がdigite
  • が同じを使用して再発ように剰余を入れ基数によって
    • デバイド(ベース)

      ベース、しかし部門の他の部分。 (商。)あなたは1000年の進値を見つけている場合は、あなたが

      dec2baseを取るされ

    (1000,16):

    • 場合、最初のパラメータ== 0、リターンは、あなたは
    • 1000年
    • を行っているMOD 16(= 8) - > 8
    • dec2baseを保存する(62、16) - >再帰ステップ

    今や明らかに、リクルージョンステップを実行するたびに、最初のパラメータは小さくなり、最終的にはになる必要があります。最終的に終了します。

    ここではPythonで本当のシンプルなバージョンです:ベースはあなたがアルファAFに10から15までの値を変換するの世話をする必要があります何でも> 9(16言う)、であれば、今すぐ

    result = "" 
    
    def dec2base(n,b): 
        global result 
        if n <= 0: return 
        result = str(n % b) + result # why am I prepending it? 
        dec2base(n // b, b) 
    
    if __name__ == '__main__': 
        dec2base(1000,8) 
        print result 
    

    私はそれが例のようにレイアウトしたいので、これは意図的に非常にエレガントではありません。

  • +2

    グローバル変数を変更して結果を伝える再帰関数? *真剣に*? – Ben

    +1

    これは例のようにどのように配置されていると思いますか?どこからグローバル変数の泉が必要でしたか? –

    +0

    ええ、それは私に前置きについての質問をする機会を与えるからです。あなたはそれが好きではない、あなた自身の答えを書く。 –

    1

    あなたのソリューションにはわずかな間違いがあります。

    def dec2base(n, b): 
        if n < b:       # so it will work for bases other than 10 
         return [n] 
        else: 
         return dec2base(n//b, b) + [n%b] # you're just missing "//b" here 
    

    あなたは、いくつかのprint文を追加します。この

    def dec2base(n, b): 
        if not n: 
         return [] 
        return dec2base(n//b, b) + [n%b] 
    
    関連する問題