算法 - 斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

定义

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……..
自然中的斐波那契数列
自然中的斐波那契数列
这个数列从第3项开始,每一项都等于前两项之和
python实现:

1. 台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法

分析:1)当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;…….

实现一:
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
>>> fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
>>> fib(1)
1
>>> fib(2)
2
>>> fib(3)
3
>>> fib(4)
5
>>> fib(5)
8
>>> fib(6)
13
2. 我们可以用2*1的小矩形(下图左侧)横着或者竖着去覆盖更大的矩形,请问用8个2*1的小矩形无重叠地覆盖一个2*8的大矩形(下图右侧),总共有多少种方法?

这里写图片描述

分析
初看这道题跟斐波那契数列鸡毛关系也没有​,但是分析一下的话,还是会发现规律的。比如如果让第一个2*1小矩形直接横着去覆盖右侧的第一列矩形块的话,现在还剩下7个2*1小矩形要覆盖右侧大矩形剩余的2*7矩形块了,这不就转化为子问题了吗?如果让第一个2*1小矩形竖着去覆盖,那么第二个2*1小矩形只能也去竖着去覆盖,好补齐(因为这里8个2*1小矩形没有什么差别,所以只要最终覆盖的形状一样,每个小矩形不管处于某个位置都无关紧要),这种情况下剩余的6个2*1小矩形就要覆盖剩余的2*6矩形块了,也转化为了子问题。所以f(8) = f(7) + f(6),也转化为了斐波那契数列问题,代码同上,其他细节问题也不再讨论。

3. 写一个函数,输入n,求斐波那契数列的第n项
def fib(n):
  i, a, b = 0, 0, 1
  while i < n:
    a, b = b, a+b
    i = i + 1
  return a
>>> fib(1)
1
>>> fib(2) 
1
>>> fib(3)
2
>>> fib(4)
3
>>> fib(5)
5
>>> fib(6)
8

得定义第一项和第二项是啥

猜你喜欢

转载自blog.csdn.net/wang725/article/details/81462855