青蛙跳台阶,每次能跳一阶或者两阶,问n阶有多少种跳法
可以把问题转化成n的跳法等于n-1阶和n-2阶的跳法和。
fib = lambda n:n if n<=2 else fib(n-1)+fib(n-2)
变态青蛙跳,每次能跳一阶,两阶,…,n阶,问n阶有多少种跳法
问题可以考虑成:
fib(n) = fib(n-1) +fib(n-2) + …+fib(1)
fib(n-1) =fib(n-2) +fib(n-3) + …+fib(1)
所以:fib(n)-fib(n-1) = fib(n-1)
所以:fib(n) = 2*fib(n-1)
fib = lambda n:n if n<2 else 2*fib(n-1)
代码:
解法一:
class Solution:
@cache
def jumpFloorII(self, number):
# write code here
if number ==1:
return 1
if number ==0:
return 1
return 2*self.jumpFloorII(number-1)
解法二:
使用装饰器,可以减少计算次数,效率与解法一相同
import functools
def cache(func):
result = {}
@functools.wraps(func)
def wrapper(self,n):
if result.get(n, 0):
return result.get(n)
else:
result[n] = func(self,n)
return result[n]
return wrapper
class Solution:
@cache
def jumpFloorII(self, number):
# write code here
if number ==1:
return 1
if number ==0:
return 1
result = 0
for i in range(number):
result += self.jumpFloorII(i)
return result