首页 > 解决方案 > python中的帕斯卡三角形不使用任何循环

问题描述

所以我试图实现一个帕斯卡的三角形,它在python中产生以下内容:

pascal_triangle(5) prints:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

问题是我试图在不使用任何类型的循环的情况下做到这一点,但无法弄清楚如何做到这一点。任何帮助,将不胜感激。比你。

这是我到目前为止所拥有的:

   def factorial(x):
            if x == 0:
                    return 1
            else: 
                    x * factorial(x - 1)

    def pascal_triangle(n):`

更新:

print_pascal_line(r):
    if r == 0:
        return 1
    else:
        R = print_pascal_line(r-1)
        return 1 +

标签: pythonrecursionpascals-triangle

解决方案


帕斯卡三角形的每个元素都使用二项式系数进行评估。这个值,通常被称为nCr,询问“给定n物品,你可以用多少种方式C挑选r东西?”

以项目ab和为例c。我们可以通过多少种方式创建以下尺寸的组合?

  1. 只有 1 种方法可以选择 0 个项目:{}
  2. 有 3 种可能的组合:{a}{b}{c}
  3. 同样,3 种方式:{a, b}, {a, c}, 或{b, c}
  4. 仅有的{a, b, c}

你会知道,这恰好是帕斯卡三角形的第 3 级:1 3 3 1!事实证明,我们可以在每个级别上使用它。

0: nCr(0, 0)
1: nCr(1, 0) nCr(1, 1)
2: nCr(2, 0) nCr(2, 1) nCr(2, 2)
3: nCr(3, 0) nCr(3, 1) nCr(3, 2) nCr(3, 3)
etc
etc

那么,我们如何为此编写代码呢?看着这个答案,我们得到了我们的nCr功能

In [454]: import functools as ft

In [455]: import operator as op

In [456]: def nCr(n, r):
     ...:     r = min(r, n-r)
     ...:     numer = ft.reduce(op.mul, range(n, n - r, -1), 1)
     ...:     denom = ft.reduce(op.mul, range(1, r + 1), 1)
     ...:     return numer // denom
     ...:

最后,让我们创建一个递归函数将它们联系在一起。

In [457]: def pascal(n):
     ...:     if n >= 1:
     ...:         pascal(n - 1)
     ...:         print(' '.join(str(nCr(n - 1, r)) for r in range(n)))
     ...:

In [463]: pascal(5)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

从技术上讲,这应该是pascal(4)因为帕斯卡的三角形是零索引*,但我只是按照 OP 的要求进行。如果我们想改变它,我们将改变我们的pascal功能

In [468]: def pascal(n):
     ...:     if n >= 0:
     ...:         pascal(n - 1)
     ...:         print(' '.join(str(nCr(n, r)) for r in range(n + 1)))
     ...:

推荐阅读