from pythonds.basic.stack import Stack
rStack = Stack()
def toStr(n,base):
convertString = "0123456789ABCDEF"
while n > 0:
if n < base:
rStack.push(convertString[n])
else:
rStack.push(convertString[n % base])
n = n // base
res = ""
while not rStack.isEmpty():
res = res + str(rStack.pop())
return res
print(toStr(1345,2))
我指的是this tutorial并且还粘贴了上面的代码。该教程说该函数是递归的,但我没有看到任何地方的递归调用,只是一个while循环。我错过了什么?
答案 0 :(得分:3)
你是对的,这个特殊功能不递归。然而,上下文中,在上一张幻灯片中有一个递归函数,在这一个中,他们希望在内部展示它的行为。他们后来说:
前面的例子 [即有问题的那个 - B。] 让我们深入了解Python如何实现递归函数调用。
所以,是的,标题是误导性的,它应该是扩展递归函数或模仿带有堆栈的递归函数行为或类似的东西。
可以说这个函数在某种意义上采用递归方法/策略来解决问题,但本身并不是递归的。
答案 1 :(得分:3)
这里的问题是将数字转换为给定表示法中的字符串。
该函数的“库存”实际上看起来像这样:
push(d1)
push(d2)
...
push(dn-1)
push(dn)
res+=pop(dn)
res+=pop(dn-1)
...
res+=pop(d2)
res+=pop(d1)
有效:
def pushpop():
push(dx)
pushpop(dx+1...dn)
res+=pop(dx)
即。 处理特定数据块的步骤包含处理其余数据的所有步骤 (每个块以相同方式处理)。
可以认为函数是递归的(因为它们倾向于将术语应用于狭义上的子例程),但它实现的算法肯定是。
为了让您更好地感受到差异,这是针对同一问题的迭代解决方案:
def toStr(n,base):
charmap = "0123456789ABCDEF"
res=''
while n > 0:
res = charmap[n % base] + res
n = n // base
return res
正如您所看到的,此方法具有更低的内存占用,因为它没有 stockpile 任务。这是不同的:迭代算法通过变异使用相同的状态实例执行每个步骤,而递归的为每个步骤创建一个新实例< / em>,如果还需要旧的那些,必然会储存它们。
答案 2 :(得分:0)
因为您正在使用堆栈结构。
如果考虑如何实现函数调用,递归本质上是让编译器为您管理一堆调用的简单方法。
这个函数手动完成所有堆栈处理,但它在概念上仍然是一个递归函数,只是手动完成堆栈管理而不是让编译器完成它。