为啥青蛙上楼问题数学法与动态规划法结果不一致问题
题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
方法一:动态规划
class Solution:
def numWays(self, n):
a, b = 1, 1
for _ in range(n):
a, b = b, a + b
return a % 1000000007
a = Solution()
print(a.numWays(77))
print(a.numWays(78))
输出结果:
261180706
923369890
方法二:纯数学排列组合
class Solution:
def factorial(self, n): # 阶乘函数
if n == 0:
return 1
else:
a = 1
for i in range(1, n + 1):
a *= i
return a
def numWays(self, n: int) -> int:
step_2 = n // 2
ways = 0
for i in range(step_2 + 1):
total_step = n - i
ways += self.factorial(total_step) / (self.factorial(i) * self.factorial(n - 2 * i))
return ways % 1000000007
a = Solution()
print(a.numWays(77))
print(a.numWays(78))
输出结果:
261180706.0
923369889.0
可见 n=77时一致而n=78时不一致,是否是计算精度限制?该怎么解决?