【发布时间】:2016-02-27 01:18:52
【问题描述】:
我很高兴在 Python 中重新学习递归,虽然基础很容易,但似乎有一点我只是失去了递归解决问题的能力。
例如下面的问题。
编写一个递归函数,它有两个参数,n,一个以 10 为底的正整数,b,一个 2 到 9 之间的整数。该函数返回数字 n 的基 b 表示。数字的底数 b 表示使用数字 0,..,b-1,数字的位置表示底数的幂。
>>> base(5,3) # write 5 in base 3
'12'
>>> base(887,7) # write 887 in base 7
'2405'
我在不使用递归的情况下解决了问题。
def base(n, b):
if n == 0:
return [0]
digits = []
while n:
digits.append(int(n % b))
n //= b
return digits[::-1]
如果有人愿意指导我递归地解决这个问题,将不胜感激。
另外,学习递归思考以一个接一个地练习问题的最佳方法是什么?我习惯于让新概念立即为我点击,我用递归撞到这堵砖墙的事实让我有些担心。
【问题讨论】:
-
“虽然这确实返回了正确的答案,但效率低下” - 是什么让您认为您的迭代解决方案效率低下?似乎没有什么明显的不足。严格来说,有一些算法具有更好的渐近运行时间,但它们需要的背景知识比你合理预期的要复杂得多,而且只有当涉及的数字达到几百位数时,它们才会变得有价值。
-
另外,请记住,递归函数的性能通常很差,因为它们的开销很大
-
等等,Python 3?您应该使用
//=而不是/=进行楼层划分。也许这就是您认为它效率低下的原因;如果你使用真正的除法,你得到的结果是错误的。 -
@user2357112 啊啊啊。谢谢!这解决了所有零在答案之前返回的问题(这就是为什么我认为它效率低下)
标签: python python-3.x recursion base