帕斯卡';不使用任何循环的python中的s三角形
因此,我尝试实现一个pascal三角形,它在python中生成以下内容:帕斯卡';不使用任何循环的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_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
为例。我们有多少种方法可以创建以下尺寸的组合
{}
{a}
、{b}
或{c}
{a,b}
,{a,c}
,或{b,c}
{a,b,c}
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
为例。我们有多少种方法可以创建以下尺寸的组合
{}
{a}
、{b}
或{c}
{a,b}
,{a,c}
,或{b,c}
{a,b,c}
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==