python - 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 +
解决方案
帕斯卡三角形的每个元素都使用二项式系数进行评估。这个值,通常被称为nCr
,询问“给定n
物品,你可以用多少种方式C
挑选r
东西?”
以项目a
、b
和为例c
。我们可以通过多少种方式创建以下尺寸的组合?
- 只有 1 种方法可以选择 0 个项目:
{}
- 有 3 种可能的组合:
{a}
、{b}
或{c}
- 同样,3 种方式:
{a, b}
,{a, c}
, 或{b, c}
- 仅有的
{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)))
...:
推荐阅读
- r - R中带有createFolds函数的训练和测试集
- vb.net - 如何在图片框的中心张贴标签?
- javascript - querySelectorAll 不显示数组中的所有元素,角度材料
- javascript - 如何使可变返回数而不是功能?
- java - 将 Spring Boot 从 1.5 升级到 2 后,REST 端点给出 404 响应
- python - Python套接字在两台PC之间不起作用
- android - 将 LiveData/ViewModel 与片段一起使用?
- here-api - 为什么我从 Here Routing API 和 Here Maps 网站得到不同的结果?
- svelte - $: 的简化语法将语句标记为反应式
- reactjs - 以编程方式在 react-jsonschema-forms 中设置默认值