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 的任何值开始,则循环永远不会结束。

另一个观察结果 - 如果 b 不等于 10,“如果 n < 10 返回 [n]”的逻辑似乎没有意义。例如,9 < 10,但我假设 dec2base(9,2) 的值不会是 [9]。它将是 [1,0,0,1]。

于 2012-05-10T01:18:13.173 回答
2

好的,在任何递归函数中,必须有一些函数变为零才能停止。在这种情况下,您想要的是真正模拟您手动执行的方式:

  • 除以基数(基数)
  • 将剩余部分作为数字放入
  • recur 使用相同的基数,但除法的另一部分。(商。)

也就是说,如果您要找到 1000 的十六进制值,则取

dec2base(1000,16):

  • 如果第一个参数== 0,返回,你就完成了
  • 1000 mod 16 (=8) -> 保存 8
  • dec2base(62, 16) -> 递归步骤

现在,很明显,每次你进行recusion step,第一个参数都会变小,如果你仔细想想,它最终必须变为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 到 alpha 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 语句的第二个分支。您需要将减少的值传递给递归函数调用,以便最终n < 10评估为 True。

于 2012-05-10T01:16:15.000 回答