汉诺塔-小青蛙

汉诺塔问题

汉诺塔的解法在于将问题分解

可以说汉诺塔只有三步

 

 

 

 

代码写过程

def hanoi(n, A, B, C):
    """
    :param n: 问题规模
    :param A: 起始盘子
    :param B: 路过盘子
    :param C: 目标盘子
    :return:
    """
    if n > 0:
        hanoi(n-1, A, C, B) # 打开冰箱门,把B当做目标盘子
        print("%s->%s" % (A, C)) # 把大象装进冰箱,进入冰箱的大象肯定是从上向下的
        hanoi(n-1, B, A, C) # 关上冰箱门,B是起始盘子

代码写次数

def func(n):
    if n<=1:
        return n
    else:
        return func(n-1)+1+func(n-1)

算数写次数

总次数:2**n-1

小青蛙问题

本质:问题的拆解+累加

青蛙跳台阶算法,每次可以跳1级或两级,请问有n级台阶,有多少种跳法

用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1;

当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1;

当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:Fib(2) = Fib(1) + Fib(0) = 2;

当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有Fib(3-1)中跳法; 第一次跳出二阶后,后面还有Fib(3-2)中跳法;第一次跳出三阶后,后面还有Fib(3-3)中跳法

Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;

当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法; 第一次跳出二阶后,后面还有Fib(n-2)中跳法..........................第一次跳出n阶后, 后面还有 Fib(n-n)中跳法.

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

又因为Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)

两式相减得:Fib(n)-Fib(n-1)=Fib(n-1) =====》 Fib(n) = 2*Fib(n-1) n >= 2

def climbStairs(n):
    if n==1:
        return 1
    elif n==2:
        return 2
    else:
        return self.climbStairs(n-1)+self.climbStairs(n-2)

使用循环

def climbStairs(n):
    if n==1 or n==2:
        return n
    a=1;b=2;c=3
    for i in range(3,n+1):
        c=a+b;a=b;b=c
    return c

  

posted @ 2018-04-23 21:08  瓜田月夜  阅读(230)  评论(0编辑  收藏  举报