剑指offer整理(附python代码)——递归

1.斐波那契数列

问题描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

考察点:递归,找函数通式

从第3项开始,数值为前两项的和。

思路

  • 通式:f(n)=f(n-1)+f(n-2) (n>3), f(n)=0 (n=0),f(n)=1 (n=2)。
  • 非递归化:依次算出前n项。
  • 注意,从第0项开始。f(n)共需计算n-1次累加。
class Solution1:
    def Fibonacci(self, n):
        # write code here
        if n<=0:
            return 0
        elif n<2:
            return n
        else:
            f1 = 0
            f2 = 1
            for i in range(n-1):
                #执行n-1次,因为f(0)算第0项。
                fin = f1+f2
                f1 = f2
                f2 = fin
            return fin
if __name__ == '__main__':
    s = Solution1()
    print s.Fibonacci(5)
5

2.跳水台

问题描述

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

考察点:递归,找规律

思路

  1. 通式:f(n)=f(n-1)+f(n-2) , n>3; f(n)=n ,n<=2。
  2. 可以转化为开始跳一级台阶,后面有f(n-1)种方法;开始跳2级,后面有f(n-2)种方法,即斐波那契。
  3. 注意,从第1项开始。f(n)共需计算n-2次累加。
class Solution2:
    def jumpFloor(self, number):
        # write code here
        if number < 1:
            return -1
        elif (number == 1 or number == 2):
            return number
        else:
            f = 1
            s = 2
            t = 0
            #执行number-2次
            for i in range(number-2):
                t = f + s
                f = s
                s = t
            return t
if __name__ == '__main__':
    s = Solution2()
    print s.jumpFloor(5)
8

3.变态跳水台

问题描述

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

考察点:递归,找规律,数学归纳

思路

  • 通项:f(n)=2^(n-1),n>2; f(n)=n,n<=2;
  • 借助循环算幂运算
import math
class Solution3:
    def jumpFloorII(self, number):
        # write code here
        if number<1:
            return 0
        elif number<3:
            return number
        else:
            res = 2
            for i in range(number-2):
                # 执行number-2次
                res = 2*res
            return res
if __name__ == '__main__':
    s = Solution3()
    print s.jumpFloorII(5)

4.矩形覆盖

问题描述

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

考察点:递归,推公式

思路

  1. 左上角横放,则左下角也得横放,右侧还有f(n-2)种方法;
  2. 左下角竖放,则右侧还有f(n-1)种方法;
  3. 通项:f(n)=f(n-1)+f(n-2),n>3; f(n)=n ,n<=2。
class Solution4:
    def rectCover(self, number):
        # write code here
        if number<1:
            return 0
        elif number<3:
            return number
        else:
            f1 = 1
            f2 = 2
            for i in range(number-2):
                res = f1+f2
                f1 = f2
                f2 = res
            return res

if __name__ == '__main__':
    s = Solution4()
    print s.rectCover(5)
8

猜你喜欢

转载自blog.csdn.net/jinfeixibi123456789/article/details/81042210