大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
n=0时,f(n)=0 n=1时,f(n)=1 n>1时,f(n)=f(n-1)+f(n-2)
法一:用循环较快
class Solution:
def fib(self, x):
if x<=0:
return 0
elif x ==1:
return 1
else:
n, a, b = 0, 0, 1
while n+1 != x:
a, b = b, a + b
n += 1
return b
a = Solution()
b = a.fib(4)
print(b)
法二:用递归,较慢
class Solution:
def fib(self, x):
if x<= 0:
return 0
elif x==1:
return 1
else:
return self.fib(x-1)+self.fib(x-2)
a = Solution()
b = a.fib(4)
print(b)
题目拓展1:跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:
若一个台阶,则只要一种方法;若两个台阶,有两种跳法:分两次跳,一次一级,或者一次两个台阶
把n阶跳台的跳法看成n的函数f(n)。当n>2时,第一次跳的时候就有两种不同的跳法,一是第一次跳一级,跳法数目为剩下n-1级跳法数目即f(n-1),二是第一次跳两级,跳法数目为剩下n-2级跳法数目即f(n-2)。所以总的跳法数目为f(n)=f(n-1)+f(n-2)。也就是说和斐波那契数列一样。同一个题目,即第n阶跳台跳法数目等于n-1阶跳台跳法数目与n-2阶跳台跳法数目之和。
#循环:
class Solution:
def jump(self, x):
if x <= 0:
return 0
elif x == 1:
return 1
elif x == 2:
return 2
else:
n, a, b = 1, 1, 1
while n != x:
a, b = b, a + b
n += 1
return b
#另一种写法:实测两种运行时间相近
#a, b = 1,2
#for i in range(3,x+1):
#a,b = b,a+b
#return b
#递归:
class Solution:
def jump(self,n):
if n == 1:
return 1#如果是一个台阶,有一种跳法
elif n == 2:
return 2#如果是两个台阶,有两种跳法
else:
return self.jump(n-1)+self.jump(n-2)
题目拓展2:变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:同理,把n阶跳台的跳法看成n的函数f(n)。当n>2时,第一次跳的时候就有多种不同,一是第一次只跳一级,剩下n-1级台阶的跳法,二是第一次只跳两级,剩下n-2级台阶跳法,三是第一次只跳三级,剩下n-3级台阶跳法…如123级台阶跳法分别为124,则第四级台阶跳法为,第一次只跳一级+第一次只跳两级+第一次只跳三级+第一次只跳四级,即f(n) = f(n-1)+f(n-2)+f(n-3) +f(n-4)即f(3)+f(2)+f(1)+f(0)=4+2+1+1=8,找到规律为2**(n-1)
class Solution:
def jump(self, n):
if n<=0:
return 0
return 2**(n-1)
题目拓展3:矩形覆盖
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:同理,吧n列的矩形放法看成f(n) ,n>2有两种放法:竖着放,剩下f(n-1)个放法,横着放,剩下f(n-2)种放法。一共f(n)=f(n-1)+f(n-2)。代码同