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
# 递归求和: 5050def 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)
















