俗语:普通的程序员用迭代,天才的程序员用递归。
概念
从原理上讲,就是函数调用自身这么一个行为。
如果递归使用不当会很容易出现“死循环”-一种无法结束的函数,直至耗尽所有内存资源。不过Python3处于“善意的保护”,对递归的深度默认限制是100层,所以循环100次后一定会停止。
不过如果些爬虫,想要爬取更深层次的话可以手动修改递归深度,如下
import sys
sys.setrecursionlimit(100000000) ## 将递归的限制设置成一亿次
阶乘函数
正整数的阶乘是指从1乘以2乘以3乘以4一直乘到所要求的数。例如1*2*3*4*5=120,所以120是5的阶乘
普通实现
def factorial(x) :
result = 0
for x in range(1,x):
result *= x
return result * x
number = int(input('请输入一个整数:'))
print('%d 的阶乘是:%d' % (number,factorial(number)))
递归实现
def factorial(x) :
if x == 1:
return 1
else :
return x * factorial(x - 1)
number = int(input('请输入一个整数:'))
print('%d 的阶乘是:%d' % (number,factorial(number)))
兔子生兔子
学每一种编程语言基本上都会实现“兔生兔”算法。
兔子在出生两个月之后,就有繁殖能力,在拥有繁殖能力之后,这对兔子每个月能生出一对小兔子。假设兔子都不死去,能够一直繁殖下去,那么一年之后可以繁殖多少只兔子。
递归实现
# 递归实现
def rabbit(n):
if n < 0:
print("输入错误")
return -1
if n == 1 or n == 2:
return 1
else :
return rabbit(n-1) + rabbit(n-2)
print("一年后总共有%d 对兔子" % rabbit(12))
总结
如果递归忘记了返回或者错误的设置了返回条件,那么执行这样的递归代码就会变成一个黑洞:只进不出!所以再写递归代码的时候一定要注意返回。
递归有缺陷,但既然存在于各种编程语言中,必有其存在的价值。递归用在妙处,自然代码简介、所以说“天才的程序员用递归”