如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)
4.递归算法很简洁,递归效率不高,递归层次过多会导致栈溢出
递归无限循环:
def recursion():
return recursion()
求阶乘:
方法一、for循环:
def factorial(x):
re = x
for i in range(1,x):
re *= i
return re
num = int(input('请输入一个正整数:'))
result = factorial(num)
print('%d的阶乘是%d'%(num,result))
方法二、递归
def factorial(x):
if x == 1:
return 1
else:
return x * factorial(x-1)
num = int(input('请输入一个正整数:'))
result = factorial(num)
print('%d的阶乘是%d'%(num,result))
以5的阶乘为例,函数的计算过程是:
==> factorial(5)
==> 5 * factorial(4)
==> 5 * (4 * factorial(3))
==> 5 * (4 * (3 * factorial(2)))
==> 5 * (4 * (3 * (2 * factorial(1))))
==> 5 * (4 * (3 * (2 * 1)))
==> 5 * (4 * (3 * 2))
==> 5 * (4 * 6)
==> 5 * 24
==> 120
------------------------分割线,哈哈哈---------------------------
课后作业:
0.递归在编程上的形式是如何表现的?
编程上表现为函数调用自身
1.递归必须满足哪两个基本条件?
a、函数调用自身;
b、设置了明确的结束条件
2.思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?
3.用递归去计算阶乘问题和斐波那契数列是很糟糕的算法,你知道为什么吗?
4.请聊一聊递归的优缺点:
5.拿手机拍一张“递归自拍照片”
----------------------分割线,哈哈哈--------------------
动动手
0.使用递归编写一个power()函数模拟内建函数pow(),即power(x,y)为计算并返回x的y次幂的值。
def power(x,y):
if y == 1:
return x
else:
return x * power(x,y-1)
print('------------------幂运算-----------------------')
Bnum = int(input('请输入一个底数:'))
Enum = int(input('请输入指数:'))
result = power(Bnum,Enum)
print('%d的%d次方等于%d.'%(Bnum,Enum,result))
1.使用递归编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x,y)返回值为参数x和参数y的最大公约数。
def gcd(m,n):
if n == 0:
return m
else:
return gcd(n,m%n)
a = int(input('请输入第一个正整数:'))
b = int(input('请输入第二个正整数:'))
result = gcd(a,b)
print('%d与%d的最大公约数是:%d'%(a,b,result))
转载于:https://blog.51cto.com/wszzdanm/2165658