帕斯卡';不使用任何循环的python中的s三角形

帕斯卡';不使用任何循环的python中的s三角形,python,recursion,pascals-triangle,Python,Recursion,Pascals Triangle,因此,我尝试实现一个pascal三角形,它在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:

因此,我尝试实现一个pascal三角形,它在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 +

首先创建一个打印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)
def pascal_三角形(n):
辅助(0,n)
def aux(当前_线,n):
如果当前线路
或者,您可以使用默认参数将其仅用于一个函数:

def pascal_triangle(n, current_line = 0):
    if current_line < n:
        print_pascal_line(current_line)
        pascal_triangle(n, current_line + 1)
def pascal_三角形(n,当前_线=0):
如果当前线路
首先创建一个函数来打印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)
def pascal_三角形(n):
辅助(0,n)
def aux(当前_线,n):
如果当前线路
或者,您可以使用默认参数将其仅用于一个函数:

def pascal_triangle(n, current_line = 0):
    if current_line < n:
        print_pascal_line(current_line)
        pascal_triangle(n, current_line + 1)
def pascal_三角形(n,当前_线=0):
如果当前线路
这个怎么样

def pascal_triangle(n, line=None):
    if n == 0: return
    if line is None: 
        line = [1]
    print(" ".join(map(str, line)))
    pascal_line(line)
    pascal_triangle(n-1, line)

def pascal_line(line, i=0, add=0):
    if i >= len(line):
        line.append(add)
        return
    add, line[i] = line[i], line[i] + add
    pascal_line(line, i+1, add)
这个怎么样

def pascal_triangle(n, line=None):
    if n == 0: return
    if line is None: 
        line = [1]
    print(" ".join(map(str, line)))
    pascal_line(line)
    pascal_triangle(n-1, line)

def pascal_line(line, i=0, add=0):
    if i >= len(line):
        line.append(add)
        return
    add, line[i] = line[i], line[i] + add
    pascal_line(line, i+1, add)

Pascal三角形的每个元素都使用。该值通常被称为
nCr
,询问“给定
n
项您可以用多少方法
C
选择
r
项?”

以项目
a
b
c
为例。我们有多少种方法可以创建以下尺寸的组合

  • 只有一种方法可以选择0项:
    {}
  • 有三种可能的组合:
    {a}
    {b}
    {c}
  • 同样,有3种方式:
    {a,b}
    {a,c}
    ,或
    {b,c}
  • 只有
    {a,b,c}
  • 你会知道什么,恰好是帕斯卡三角形的3级:
    131
    !事实证明,我们可以在各个层面上使用它

    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)
    ,因为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)))
         ...:
    

    Pascal三角形的每个元素都使用。该值通常被称为
    nCr
    ,询问“给定
    n
    项您可以用多少方法
    C
    选择
    r
    项?”

    以项目
    a
    b
    c
    为例。我们有多少种方法可以创建以下尺寸的组合

  • 只有一种方法可以选择0项:
    {}
  • 有三种可能的组合:
    {a}
    {b}
    {c}
  • 同样,有3种方式:
    {a,b}
    {a,c}
    ,或
    {b,c}
  • 只有
    {a,b,c}
  • 你会知道什么,恰好是帕斯卡三角形的3级:
    131
    !事实证明,我们可以在各个层面上使用它

    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)
    ,因为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
    
    def pascal_行(n):
    def下一行(此行):
    如果此行==[]:
    返回[]
    其他:
    返回[sum(thisline[:2])]+下一行(thisline[1:])
    如果n==1:
    返回[1]
    elif n==2:
    返回[1,1]
    其他:
    返回[1]+下一行(帕斯卡线(n-1))
    def pascal_三角形(n):
    def打印行(m):
    如果m
    # 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\u line
    通过递归调用
    nextline
    和第(n-1)行(它自己以前的解决方案)来导出pascal三角形中的第n行

    函数
    pascal\u triangle
    通过递归调用
    pascal\u line
    打印pascal triangle中的行

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

    一个纯递归解决方案(没有循环,没有赋值,没有外部模块,只有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
    
    def pascal_行(n):
    def下一行(此行):
    如果此行==[]:
    返回[]
    其他:
    返回[sum(thisline[:2])]+下一行(thisline[1:])
    如果n==