Python ::迭代vs字符串操作的递归

时间:2016-05-28 05:12:51

标签: python recursion iteration

在下面的示例中,两个函数的程序数大致相同。

def lenIter(aStr):
    count = 0
    for c in aStr:
        count += 1
    return count

def lenRecur(aStr):
    if aStr == '':
        return 0
    return 1 + lenRecur(aStr[1:])

在两种技术之间进行选择是一种风格问题还是这里有一种最有效的方法?

3 个答案:

答案 0 :(得分:2)

Python does not perform tail call optimization,因此递归解决方案可以在长字符串上遇到堆栈溢出。迭代方法没有这个缺陷。

那就是说,len(str)比两种方法都快。

答案 1 :(得分:2)

  1. 这是不正确的:'功能具有大致相同的程序数'。您可能意味着:'这些程序需要相同数量的操作,或者更正式地说,它们具有相同的计算时间复杂度。
  2. 虽然具有相同的计算时间复杂度,但使用递归的那个需要额外的CPU指令来执行用于在递归期间创建新的过程实例以及切换上下文的代码。从每次递归返回后清理。虽然这些操作不会增加理论计算复杂性,但在大多数现实操作系统的实现中,它们将会带来很大的负载。
  3. 此外,resursive方法将具有更高的空间复杂度,因为每个递归调用过程的新实例都需要新数据存储。

答案 2 :(得分:0)

当然第一种方法更加优化,因为python不需要进行大量的函数调用和字符串切片,其中每个操作都包含一些其他操作,这些操作对python解释器来说花费很多,并且可能导致将来和处理日志字符串时会遇到很多问题。

作为一种更加pythonic的方式,您最好使用len()函数来获取字符串的长度。

您还可以使用code对象查看每个函数所需的堆栈大小:

>>> lenRecur.__code__.co_stacksize
4
>>> lenIter.__code__.co_stacksize
3