0

正の整数dec2base(n, b)の基数のリストを返す再帰関数 を作成する必要があります。例えば。bn

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]

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

4

4 に答える 4

3

メソッドのどの時点でもnの値をデクリメントしていないため、n> = 10の値で開始した場合、ループは終了しません。

別の観察-「ifn<10return [n]」の論理は、bが10に等しくない場合は意味がないようです。たとえば、9 <10ですが、dec2base(9,2)の値を想定しています。 [9]ではありません。[1,0,0,1]になります。

于 2012-05-10T01:18:13.173 に答える
2

さて、再帰関数には、何かを停止させるためにゼロになる関数が必要です。この場合、あなたが望むのは、手動で行う方法を実際にモデル化することです。

  • 基数 (基数) で割る
  • 余りを数字で入れる
  • 同じベースを使用して繰り返しますが、除算の他の部分を使用します。(商。)

つまり、1000 の 16 進値を見つけている場合は、

dec2base(1000,16):

  • 最初のパラメーター == 0 の場合、戻ります。完了です
  • 1000 mod 16 (=8) -> 8 を保存
  • dec2base(62, 16) -> 再帰ステップ

さて、再帰ステップを行うたびに、最初のパラメーターが小さくなり、考えてみると、最終的には 0 になる必要があります。したがって、最終的には終了します。

Python での実際の単純なバージョンは次のとおりです。

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

ここで、基数が 9 (たとえば 16) より大きい場合は、10 から 15 までの値をアルファ af に変換する必要があります。これは、例のようにレイアウトしたかったため、意図的にあまりエレガントではありません。

于 2012-05-10T01:23:41.967 に答える
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

このように少し単純化できます

def dec2base(n, b):
    if not n:
        return []
    return dec2base(n//b, b) + [n%b]
于 2012-05-10T01:44:50.593 に答える
0

dec2base(n, b)無限へのあなたの呼びかけ。あなたが電話する場合

dec2base(20, b)

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

于 2012-05-10T01:16:15.000 に答える