函数递归
什么是递归?
递归就是递归式的函数
从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么故事呢?
从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么故事呢?…
递归简单理解就是自己去引用自己!
递归式函数,在函数中自己调用自己!
无穷递归,如果这个函数被调用,程序的内存会溢出,效果类似于死循环
def fn():
fn()
fn()
递归是解决问题的一种方式,它和循环很像
它的整体思想是,将一个大问题分解为一个个的小问题,直到问题无法分解时,再去解决问题
递归式函数的两个要件
1.基线条件
- 问题可以被分解为的最小问题,当满足基线条件时,递归就不在执行了
2.递归条件
- 将问题继续分解的条件
递归和循环类似,基本是可以互相代替的
- 循环编写起来比较容易,阅读起来稍难
- 递归编写起来难,但是方便阅读
1、斐波那契
问题:求第n个斐波那契数列的值(n>2)
斐波那契额数列(Fibonacci sequence):0、1、1、2、3、5、8、13、21、34;
分析:从F(2)开始,结果为前两个数之和;即F(0)=0;F(1)=1;F(2) = F(0) + F(1) ;F(3)=F(1)+F(2)
def Fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return Fibonacci(n-1) + Fibonacci(n-2)
while True:
num = int(input("please input a number:"))
if num < 0:
print("Error!!!")
break
else:
print(Fibonacci(num))
执行结果:
D:\网络安全\Python\py_code>python Class7斐波那契额数列.py
please input a number:0
0
please input a number:1
1
please input a number:2
1
please input a number:3
2
please input a number:4
3
please input a number:5
5
please input a number:6
8
please input a number:7
13
please input a number:-1
Error!!!
D:\网络安全\Python\py_code>
2、兔子繁殖
问题:有一对刚出生的兔子,经过四个月成长为一对成熟的兔子,成熟后,每月生出一对兔子,若不考虑兔子死亡,第n月,共有多少对兔子?
分析:四个月产生出一对新的兔子,数据如下
月数 兔子对数
1 1
2 1
3 1
4 1
5 2 第一个月的兔子经4个月成熟,生出一对兔子
6 3 每月生出一堆兔子
7 4
8 5
9 7 第5个月出生的新兔子经4个月成熟,生出新兔子
10 10
...以此类推
可以明显的得出数据的规律,即第n个月的兔子数量为,前一个月的数量+前四个月的数量
伪代码:
当n小于等于4时 数量为1
当n大于4时 数量为F(n-1)+F(n-4)
def rab(n):
if 1 <= n <= 4:
return 1
else:
return rab(n-1) + rab(n-4)
while True:
month = int(input("please input the month:"))
if month <= 0:
print("Error!!!")
break
else:
print(rab(month))
执行结果:
D:\网络安全\Python\py_code>python Class7兔子繁殖.py
please input the month:1
1
please input the month:2
1
please input the month:3
1
please input the month:4
1
please input the month:5
2
please input the month:6
3
please input the month:7
4
please input the month:8
5
please input the month:9
7
please input the month:10
10
please input the month:11
14
please input the month:12
19
please input the month:0
Error!!!
3、回文判断
说明:创建一个函数,用来检查一个任意的字符串是否是回文字符串,如果是返回True,否则返回False
回文字符串:字符串从前往后念和从后往前念是一样的。类似与如下这种
abcba
abcdefgfedcba
分析:
1、先检查第一个字符和最后一个字符是否一致,如果不一致则不是回文字符串
2、 如果一致,则看剩余的部分是否是回文字符串
检查 abcdefgfedcba 是不是回文
检查 bcdefgfedcb 是不是回文
检查 cdefgfedc 是不是回文
检查 defgfed 是不是回文
检查 efgfe 是不是回文
检查 fgf 是不是回文
检查 g 是不是回文
def hui_wen(s):
'''
该函数用来检查指定的字符串是否回文字符串,如果是返回True,否则返回False
参数:
s:就是要检查的字符串
'''
# 基线条件
if len(s) < 2 :
# 字符串的长度小于2,则字符串一定是回文
return True
elif s[0] != s[-1]:
# 第一个字符和最后一个字符不相等,不是回文字符串
return False
# 递归条件
#将字符串切片,从1开始切,那么去除掉了索引为0的元素;切到-1,即索引最后的元素,那么就不包含最后一个元素,这样一来,就切除了字符串的第一个和最后一个元素
return hui_wen(s[1:-1])
#调用函数
print(hui_wen('abcdcba'))
执行结果:
True