• 剑指offer-递归和循环-python


    -斐波那契数列-

    大家都知道斐波那契数列(1、1、2、3、5、8、13、21、34、……),现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

    n<=39

    斐波那契数列满足递归的条件:既F(n) = F(n-1)+F(n-2)

    # -*- coding:utf-8 -*-
    class Solution:
        def Fibonacci(self, n):
            # write code here
            #递归法
            if n ==0:
                return 1
            elif n ==1:
                return 1
            else:
                return self.Fibonacci(n-1) +self.Fibonacci(n-2)
                

    这种方式简单粗暴,但是允许时间太长了。

    方法2

    class Solution:
        def Fibonacci(self, n):
            a = [0,1,1]
            if n<3:
                return a[n]
            for i in range(3,n+1):
                a.append(a[i-1]+a[i-2])
            return a[n]

    跳台阶

    题目描述

    一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

    该问题本质上还是斐波那契数列

    对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以

    跳台阶满足递归的条件:既F(n) = F(n-1)+F(n-2)

    大家都知道斐波那契数列(1、1、2、3、5、8、13、21、34、……) 

    class Solution:
        def jumpFloor(self, number):
            # write code here
            a = [1,1,2]
            n = number
            if n<3:
                return a[n]
            for i in range(3,n+1):
                a.append(a[i-1]+a[i-2])
            return a[n]

    变态跳台阶

    题目描述

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

    关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:

    f(1) = 1 

    f(2) = f(2-1) + f(2-2)         //f(2-2) 表示2阶一次跳2阶的次数。  一次1阶或者2阶

    f(3) = f(3-1) + f(3-2) + f(3-3)  //1阶、2阶、3阶

    ...

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

    f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)

     f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) = f(n-1) + f(n-1)

        可以得出:

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

    # -*- coding:utf-8 -*-
    class Solution:
        def jumpFloorII(self, number):
            # write code here
            if number <=0:
                return -1
            if number ==1:
                return 1
            return 2*self.jumpFloorII(number-1)

     

    矩形覆盖

    题目描述

    我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    该问题本质上还是斐波那契数列

    class Solution:
        def rectCover(self, number):
     
            res = [0,1,2]
            while len(res) <= number:
                res.append(res[-1] + res[-2])
            return res[number]
  • 相关阅读:
    JavaSE-面向对象
    JavaSE-数组
    JavaSE-方法
    JavaSE-流程控制
    JavaSE-基础语法
    Java-初识Java
    PTH的几种食用姿势
    CVE-2020-1472 Zerologon
    OpenGL 术语
    使用IDEA创建SpringMVC项目
  • 原文地址:https://www.cnblogs.com/ansang/p/12040229.html
Copyright © 2020-2023  润新知