这个函数是递归的,即使它没有调用自身吗?

时间:2014-11-12 21:45:06

标签: python recursion

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循环。我错过了什么?

3 个答案:

答案 0 :(得分:3)

你是对的,这个特殊功能递归。然而,上下文中,在上一张幻灯片中有一个递归函数,在这一个中,他们希望在内部展示它的行为。他们后来说:

  

前面的例子 [即有问题的那个 - B。] 让我们深入了解Python如何实现递归函数调用。

所以,是的,标题是误导性的,它应该是扩展递归函数模仿带有堆栈的递归函数行为或类似的东西。

可以说这个函数在某种意义上采用递归方法/策略来解决问题,但本身并不是递归的。

答案 1 :(得分:3)

递归算法,根据定义,is a method where the solution to a problem depends on solutions to smaller instances of the same problem

这里的问题是将数字转换为给定表示法中的字符串。

该函数的“库存”实际上看起来像这样:

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)

因为您正在使用堆栈结构。

如果考虑如何实现函数调用,递归本质上是让编译器为您管理一堆调用的简单方法。

这个函数手动完成所有堆栈处理,但它在概念上仍然是一个递归函数,只是手动完成堆栈管理而不是让编译器完成它。