【算法题】剑指offer之递归与循环--python实现
程序员文章站
2022-04-07 12:33:54
...
斐波那契数列
斐波那契数列定义:从第3项开始,每一项都等于前两项之和。
F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
标准斐波那契数列(f(1)=1、f(2)=1))
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
count = 0
a , b = 0 ,1
while count < n:
a , b = b , a+b
count+=1
return a
"""
#下面的代码是用递归实现
#经过测试,在n>=32时运行时间已经超过2s
if n == 0:
return 0
if n == 1:
return 1
return self.Fibonacci(n-1) + self.Fibonacci(n-2)
"""
跳台阶
题目分析
题目实际为一个斐波那契数列(只不过f(1)=1、f(2)=2))
- 假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1)
- 假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
- 由1).2)假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
if number == 0:
return
a , b = 1 ,1
while number > 0:
a , b = b , a+b
number-=1
return a
"""
if number == 0:
return 0
if number == 1:
return 1
if number == 2:
return 2
return self.jumpFloor(number-1) + self.jumpFloor(number-2)
"""
变态跳台阶
题目分析
由上一题“跳台阶”可以联想到:
- 假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1)
- 假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
- 。。。。。。
- 假定第一次跳的是n-1阶,那么剩下的是1个台阶,跳法是f(1) = 1
- 假定第一次跳的是n阶,那么剩下的是0个台阶,跳法是f(0) = 0
因此可以得到:
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)+ f(n-1)
又因为:
f(n-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
联立上面的两个式子可以得到:
f(n) = 2* f(n-1)、 f(1) = 1 、f(0) = 0
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
if number == 0:
return
if number == 1:
return 1
return 2*self.jumpFloorII(number-1)
矩形覆盖
题目分析
题目实际为一个斐波那契数列(只不过f(1)=1、f(2)=2))
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if number == 0:
return 0
a,b = 1,1
while number > 0:
a,b = b,a+b
number -= 1
return a
"""
if number == 0:
return 0
if number == 1:
return 1
if number == 2:
return 2
return self.rectCover(number-1) + self.rectCover(number-2)
"""
上一篇: 剑指offer_递归与循环---矩形覆盖