python中不使用任何循环的Pascal三角形

2024-04-16 18:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我尝试在python中实现一个pascal三角形,它可以生成以下内容:

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

问题是我试图在不使用任何类型的循环的情况下完成它,但却不知道如何做到这一点。任何帮助都将不胜感激。比你强。在

到目前为止,我得到的是:

^{pr2}$

更新时间:

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

Tags: 类型returnifline时间情况printselse
3条回答

首先创建一个函数来打印pascal三角形的第n行,我建议您使用组合,而不是使用阶乘手动计算每一行中的值,这样效率会更高。假设这个函数名为print_pascal_line,它接收一个整数,即行号。在

你只需要:

def pascal_triangle(n):
    aux(0, n)

def aux(current_line, n):
    if current_line < n:
        print_pascal_line(current_line)
        aux(current_line + 1, n)

或者,您可以使用默认参数仅在一个函数中使用:

^{pr2}$

binomial coefficient计算帕斯卡三角形的每个元素。这个值通常被称为nCr,它询问“给定的n项您可以用多少种方式C选择{}事物?”在

ab、和{}为例。我们可以用多少种方法创建以下尺寸的组合?在

  1. 只有一种方法可以选择0项:{}
  2. 有3种可能的组合:{a}{b},或{}
  3. {cd13>{
  4. {a, b, c}

你知道吗,正好是帕斯卡三角形的第三层: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

那么,我们该如何编码呢?看看this answer我们得到了nCr函数

^{pr2}$

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

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),因为Pascal的三角形是零索引的*,但我只是根据OPs请求。如果我们想改变这个,我们将把pascal函数改为

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

一个纯递归的解决方案(没有循环,没有赋值,没有外部模块,只有使用的python函数是sum,这也是可以避免的)。这段代码可以很容易地翻译成LISP家族语言。在

def pascal_line(n):
    def nextline(thisline):
        if thisline == []:
            return []
        else:
            return [sum(thisline[:2])] + nextline(thisline[1:])
    if n == 1:
        return [1]
    elif n == 2:
        return [1, 1]
    else:
        return [1]+nextline(pascal_line(n-1))

def pascal_triangle(n):
    def printline(m):
        if m <= n:
            print(*pascal_line(m))
            printline(m+1)
    return printline(1)

pascal_triangle(6)
# output =>
# 1
# 1 1
# 1 2 1
# 1 3 3 1
# 1 4 6 4 1
# 1 5 10 10 5 1

内部函数nextline基于当前行递归地导出pascal三角形中的下一行(不带前导1)。在

函数pascal_line通过递归地调用nextline(n-1)th线(它自己以前的解决方案),导出pascal三角形中的nth线。在

函数pascal_triangle通过递归调用pascal_line输出pascal三角形中的行。在

三个递归函数一起很好地说明了递归方法的典型分而治之的本质。在

相关问题 更多 >