题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。
该题属于之前那青蛙跳台阶的扩展问题,仅仅多了一个条件,这次青蛙无论多少阶的台阶都能跳了(大长腿青蛙),按照我这小白的思维,这个问题就是在之前的青蛙跳台阶的每种方式的上加了一种嘛,之前跳三级台阶有三种方法:1·1·1,1·2和2·1,现在增加了一种就是直接跳三级,方法变成了四种,以此类推,四级台阶现在的方法就有跳一级再直接跳三级,跳二级再直接跳二级,跳三级再跳一级,以及直接跳四级,所以f(4) = f(1)+f(2)+f(3)+1,f(2)=2,f(3)=f(1)+f(2)+1,f(1)=1,此处f(n)为青蛙跳n级台阶的方法数。原理清楚了,那方法可以用递归,也能用循环。所以代码是在斐波拉契数列的基础上进行了一点改造(我这写的是真的烂)。
class Solution:
def jumpFloorII(self, number): # 根据之前的青蛙台阶问题,采取相同的思想方法
if number < 2: # 第一级有一种方法、第二级有两种方法、第三级有四种方法、第四级有十六种方法……
return 1 # 分析可得 f(1)=1,f(2)=f(1)+1=2,f(3)=f(1)+f(2)+1=4
# f(4)=f(1)+f(2)+f(3)+1=16……
elif number == 2: # 由上以此类推则有f(n)=f(n-1)+f(n-2)+f(n-3)+...+1
return 2 # 多出来的1是因为青蛙可以跳任意阶级,所以这个1就是一次直接跳n级
else:
save = [] # 将跳每n级的方法数存储起来,通过循环相加起来可得出答案
for i in range(number):
sum = 0
for j in range(len(save)):
sum = sum + save[j]
save.append(sum + 1)
return save[-1]
上面的是我自己想的,然后翻讨论区的时候才发现大佬的答案是真的简洁明了,收获满满,说实话,下面这个一行代码解决问题的是真的真的真的打击我QAQ!!
class Solution:
def jumpFloorII(self, number): # 通过观察规律发现青蛙跳的级数n和方法数x存在x=2^n的关系
return pow(2, number - 1)
下面这个就舒服很多,和我的思路相同(算是吧),使用递归的方法,代码简洁,就是我对递归实在不怎么深入,经常被自己绕进去,就算看懂了大佬的递归代码,自己也很难写出来一个帅气的递归。
class Solution:
def jumpFloorII(self, number): # 与方法一相同的思路,但采用的是递归的方法
if number == 0:
return 1
count = 0
for i in range(number):
count += self.jumpFloorII(i)
return count