用阶乘

时间:2019-01-23 15:25:48

标签: python fibonacci factorial

在解决leetcode 70的过程中,爬楼梯时,我想到了一个使用阶乘的答案(有多少种不同的方法来形成具有相同元素的线)。后来,我认为这个问题也可以使用斐波那契来解决,并且前几个答案似乎是相同的。

我的问题是: 是否有关于这两个为什么可能相同的正式数学证明(或直观的解释)?还是相同?

爬楼梯问题是一个问题,要求您找出一个人只走一两步就能爬上n阶楼梯的方法。 因为这只是一种表达方式,所以您可以将1和2排列成n个总和。我这样解决了问题。 max_one和max_two是可以存在的1s或2s的最大数目,我迭代了该行中可以有多少2s,找出在给定2s的情况下如何形成每个不同的行(表示为i) 分子是行中有多少个元素,分母是行中有多少个相同元素(有多少个1,有多少个2s):

from math import factorial as fac
class Solution:
  def climbStairs(self, n):
    if n == 1:  return 1
    if n == 2:  return 2 
    max_two = n//2
    max_one = n
    ways = 0
    for i in range(0,max_two+1):
      ways += fac(max_one-i)/(fac(max_one-2*i) * fac(i))

    return int(ways)

1 个答案:

答案 0 :(得分:0)

恭喜!您已经重新发现了一个非常酷的涉及斐波那契数字的身份。具体来说,您发现的规则就是这张图片的视觉效果,其中沿着这些斜对角线将帕斯卡三角形的项相加会返回斐波那契数列:

adding skew diagonals for fun and profit

要了解原因,请注意,求和中的每个项都等于(n-i),请选择i,这是Pascal三角形的第(n-i)行,第i列的条目。求和中的每一项对应于向上移动一列并超过一列,因此对应于这些线上的角度。

作为证明,您概述的论点实质上是重复计算论点的基础。我们知道,斐波那契数是指沿着大小为1和2的台阶走下楼梯的方式的数目,我们可以通过归纳法严格地证明这一点。另外,我们知道您的求和数是相同的,因为您正在枚举使用大小为2的0、1、2、3,...等步长向下移动路径的所有方法。由于我们以两种方式计算相同的数量,因此这两个表达式必须相等。

如果这还不足够,您可以使用归纳证明将其形式化,使用恒等式(n选择k)=(n-1选择k)+(n-1选择k-1)并分成案例n是偶数,n是奇数。

希望这会有所帮助!