汉诺塔问题
汉诺塔的解法在于将问题分解
可以说汉诺塔只有三步
代码写过程
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