递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。通俗一点来讲就是:在某个python文件中,有一个函数,这个函数可以在自己的函数体内根据条件,自己调用自己的函数,那么这样自身调用自身的过程或者说行为,我们称之为递归。
无参函数
如果一段代码需要重复使用,就可以把它封装到一个函数中。
定义函数
def 函数名():
下级代码
调用函数
函数名()
样例
def info():
print('小王子')
print('xiaowangzi')
print('kevin')
info()
小王子
xiaowangzi
kevin
有参函数
给函数添加了参数,在函数中,就可以使用这个参数。
定义
def 函数名(参数名):
下级代码
调用
函数名(传递的值)
样例
def check(num):
n1 = num // 10
n2 = num % 10
print('十位',n1)
print('个位', n2)
check(25)
十位: 2
个位: 5
无参递归
递归就是在函数中调用自己。
def mark():
print(1)
mark() #调用自己
mark()函数的执行过程:
当在函数外调用一次mark()函数:执行函数的下级代码,又会调用自己,再执行下级代码,仍然会调用自己……因此程序会一直不停的调用mark()函数,也就会一直不停的输出1。
有参递归
要在每次执行函数,打印不同的内容,可以给函数添加参数。
def mark():
print(1)
mark(n+1) #调用自己, 并传递大1的参数
调用mark()函数,并传递参数3,代码的执行过程:
会依次打印出3、4、5、6……逐渐增大1的数字。
无限递归
无限递归,就是会一直重复、没有结束的递归。
使用递归的方式打印编号
def fix(n):
print(n)
fix(n+1)
fix(1)
从1开始,逐一增大。
fix()函数的执行过程
输出区会依次打印1、2、3、4 。。。
在不同场景中,首次调用函数时传入的参数值不同,每次递归时,参数值的变化也不同。
def fix(n):
print(n)
fix(n*2)
fix(2)
有返回值的递归
通常我们不会让递归操作一直重复执行下去,我们会在满足特定条件时,使用return语句结束函数执行。
def move(n):
if n == 4: #当参数n的值等于4时,使用return语句结束当前函数执行
return
print(n)
print('left')
move(n+1)
move(1)
print('get')
move()函数的执行过程
move()函数会打印出参数n的值和字符串left,然后再次调用move()函数,并让参数n的值增大1。
当参数n的值变为4时,if判断条件成立,执行return语句,会结束当前函数的执行,然后回到上一层中,接着move(3)这一层函数执行完毕,回到move(2)这一层。。。直到最终move(1)这一层函数执行完毕。
如果想在递归中得到一个返回值,我们可以使用return语句返回结果。
递归的结束条件
当满足一定的条件时,递归函数不会再继续调用自己,那么这个条件就是递归的结束条件。
没有递归结束条件,程序就不知道在哪里结束,会陷入无限递归中,最终导致程序报错
一个结束条件的情况
def func(n):
if n == 1:
return 6
a = func(n-1)
return a + 1
多个结束条件情况
def func2(n):
if n == 1:
return 50
if n == 2:
return 100
a = func2(n-2)
return 500 + a
归纳返回值表达式
归纳A、B、C三种投资方案的返回值表达式。
f(n)表示第n个月的总利润
f(n)的表达式就是我们要找的规律,也就是我们需要归纳的返回值的表达式,所以可以直接写在return后面。
A的返回值表达式:return 2*f(n-1)
B的返回值表达式:return 500 + f(n-2)
C的返回值表达式:return f(n-1) + f(n-2)
应用
根据以下规律,利用递归函数写出计算n!的代码。
5!= 5*4*3*2*1
6!= 6*5*4*3*2*1
7!= 7*6*5*4*3*2*1
def f(n):
if n == 1:
return 1
return n*f(n-1)
n = int(input())
print(f(n))