递归的各种例子: “要理解递归,你必须先了解递归”,“一个人他的母亲是人类”。你可能想知道,这是与编程有毛线关系?
您可能要拆一个复杂的问题分解成几个较小的块。如果已经熟悉了循环或迭代,但在某些情况下,递归可能是一个更好的解决方案。在Python中,函数如果它调用自己,具有终止条件就是递归。为什么终止条件?调用自己时可能无法终止。
递归与列表
让我们先从一个非常简单的例子:增加所有数字在列表中。无需递归,这可能是:#!/usr/bin/env python def sum(list): sum = 0 # Add every number in the list. for i in range(0, len(list)): sum = sum + list[i] # Return the sum. return sum print(sum([5,7,3,8,10]))
我们在这里只需调用 sum 函数,该函数将每个元素的变量相加之后的总和并返回。要做到这一点也可用递归:
#!/usr/bin/env python def sum(list): if len(list) == 1: return list[0] else: return list[0] + sum(list[1:]) print(sum([5,7,3,8,10]))
如果列表的长度为1则返回列表(终止条件)。否则,它返回元素和调用函数 sum() 减去列表中的一个元素。如果所有调用执行时,它返回达到终止条件,并返回结果(答案)。
阶乘递归
阶乘的数学定义是: n! = n * (n-1)!, 如果 n > 1 and f(1) = 1. 例如: 3! = 3 x 2 x 1 = 6. 我们可以在 Python 使用递归函数实现这一点:
#!/usr/bin/env python def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) print factorial(3)
当调用阶乘函数 n = 3. 那么返回:n * factorial(n-1). 这一过程将持续直到 n = 1. 如果 n==1 ,这将返回结果。
递归的限制
每当一个函数调用自身并存储一些内存。 因此,一个递归函数比传统的函数需要更多的内存。 Python会在 1000 次调用的深度后停止函数调用。如果运行下面这个例子:#!/usr/bin/env python def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) print factorial(3000)
会得到错误如下:
RuntimeError: maximum recursion depth exceeded
在其他编程语言,程序可以简单地崩溃。可以通过修改的递归调用次数来解决此问题:
#!/usr/bin/env python import sys sys.setrecursionlimit(5000) def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) print factorial(3000)
但要记住仍有限制阶乘函数的输入。出于这个原因,应该明智地使用递归。正如现在了解到的阶乘问题,递归函数不是最好的解决方案。 对于其他问题,如遍历目录,递归可能是一个很好的解决方案。