10:类-斐波那切数列

大家都知道斐波那契数列,现在要求输入一个整数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)。代码同

发布了16 篇原创文章 · 获赞 0 · 访问量 154

猜你喜欢

转载自blog.csdn.net/qq_43275748/article/details/102778053
今日推荐