python的递归
1、递归的特点
递归算法是一种直接或间接调用自身算法的过程,在计算机编程中,递归算法对解决一大类问题是十分,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1)递归就是在过程或函数里调用自身
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。
(4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。
2、递归的要求
递归算法所体现的“重复”一般有三个要求:
(1)每次调用在规模上都有所缩小(通常是减半)
(2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)
(3)在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模位达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。
3、递归实例
#递归就是函数自己调用自己 # count = 0 # def abc(): # global count # count+=1 # print('abc') # print(count) # return abc()#函数自己调用自己,递归一定要有结束条件,输入错误的时候,可以继续往下输入,会重新调用 # #循环效率比递归效率高 # abc()#报错,超过最大的递归次数,不同于死循环,最大限制次数,最多999
#递归实现n个斐波那契数列: def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) print([fibonacci(x) for x in range(10)]) # 输出: # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
#返回n以内所有数的阶乘的和: def fn(n): if n == 1: return 1 else: return n * fn(n - 1) print(sum(map(fn, range(1, 10)))) #输出:409113
#计算1到100之间相加之和;通过循环和递归两种方式实现 def sum_cycle(n): ''' to n,The sum function ''' sum = 0 for i in range(1,n + 1): sum += i return sum def sum_recu(n): ''' to n,The sum function ''' if n > 0: return n + sum_recu(n - 1) #调用函数自身 else: return 0 print("循环求和:",sum_cycle(100)) print("递归求和:",sum_recu(100)) #输出结果: # 循环求和: 5050 # 递归求和: 5050
def func1(n): "打印100以内的奇数" if n <= 100: print(n) n += 2 return func1(n) func1(1)
#求一个数的质因数 def zhiyinshu(n): for x in range(2, int(n/2+1)): if n % x == 0: l.append(x) return zhiyinshu(n/x) l.append(int(n)) print(l) l = [] zhiyinshu(100)