Python - 递归以及斐波那契数列

什么是递归?

程序调用自身的编程技巧称为递归(recursion),递归说通俗一点,就是自己调用自己。



举例子:举个网上的例子

一个小朋友坐在第10排,他的作业本被小组长拿到了第1排,小朋友要拿回他的作业本,可以怎么办?他可以拍拍第9排小朋友,说:“帮我拿第1排的本子”,而第9排的小朋友可以拍拍第8排小朋友,说:“帮我拿第1排的本子”...如此下去,消息终于传到了第1排小朋友那里,于是他把本子递给第2排,第2排又递给第3排...终于,本子到手啦!这就是递归,拍拍小朋友的背可以类比函数调用,而小朋友们都记得要传消息、送本子,是因为他们有记忆力,这可以类比栈。



一、阶乘运算

实现阶乘运算: n...5x4x3x2x1

'''
n...5*4*3*2*1

n*(n-1)
'''

def fac(n):
    if n==1:
        return 1
    else:
        return n*fac(n-1)

print(fac(4))

'''
代码运行过程:
n = 4, 运行这行代码   return n*fab(n-1) --> 4*fac(3), 接着调用自身函数 fac()
n = 3, 运行这行代码   return n*fab(n-1) --> 4*3*fac(2), 接着调用自身函数 fac()
n = 2, 运行这行代码   return n*fab(n-1) --> 4*3*2fac(1), 接着调用自身函数 fac()
n = 1,  fac(1)=1  --> 4*3*2fac(1) --> 4*3*2*1
''' 



使用递归需要注意的点:

  1. 必须要有结束条件,不然就会进入死循环
  2. 每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少
  3. 递归执行效率不高,递归层次过多会导致栈溢出,所以使用递归的时候要注意


二、斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……


查找规律:
f(1)=1
f(2)=1
...
f(n)=f(n-1)+f(n-2) n >3

代码:

def fib(n):
    ''' 斐波那契数列 '''
    if n <= 2:
        ''' 数列前两个数都是1 '''
        r = 1
        return r  # 返回结果,并结束函数
    else:
        r = fib(n-1)+fib(n-2)  # 由数据的规律可知,第三个数的结果都是前两个数之和,所以进行递归叠加
        return r  # 返回结果,并结束函数


# print(fab(4))  # 3,调用函数并打印结果

'''
执行过程分析:
传入的 n=4, 执行: r = fib(n-1)+fib(n-2)  ---> fib(3)+fib(2)
fib(3)+fib(2) ---> fib(3) 执行后 ---> fib(2)+fib(1); fib(2)=1; fib(1)=1
所以: fib(3)+fib(2) = fib(2)+fib(1)+fib(2) = 1+1+1 =3

'''

青蛙跳台阶算法,每次可以跳1级或两级,请问有n级台阶,有多少种算法

1.当青蛙跳跳一个台阶时,只有1中跳法 1 --- f(1)=1
2.当青蛙跳跳2个台阶时,只有2中跳法 1 1;2 -- f(2)=2
3.当青蛙跳跳2个台阶时,只有2中跳法 1 1 1;1 2;2 1 --- f(3)=3 ,
同理 f(4)=5

------f(n)=f(n-1)+f(n-2)

posted @ 2021-08-20 14:34  西瓜_皮  阅读(445)  评论(0编辑  收藏  举报