Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python递归中带元组的Pascal三角形_Python_Recursion_Tuples_Pascals Triangle - Fatal编程技术网

Python递归中带元组的Pascal三角形

Python递归中带元组的Pascal三角形,python,recursion,tuples,pascals-triangle,Python,Recursion,Tuples,Pascals Triangle,我被要求用元组为Pascal三角形编写一个递归。 这是我的代码: def pascal(n): if n == 1: return (1,) if n == 2: return ((1,),(1,1)) else: new_row = () for i in range(-1, n-1): if i == -1: new_row = new_row +

我被要求用元组为Pascal三角形编写一个递归。 这是我的代码:

def pascal(n):
    if n == 1:
        return (1,)
    if n == 2:
        return ((1,),(1,1))
    else:
        new_row = ()
        for i in range(-1, n-1):
            if i == -1:
                new_row = new_row + (1,)
            elif i == n - 1:
                new_row = new_row + (1,)
            else: 
                a = pascal(n-1)[n-2][i] + pascal(n-2)[n-1][i+1]
                new_row = new_row + (a,)
        return pascal(n-1), new_row
如果调用
pascal(3)
或更高版本,我会收到一个错误,表示元组索引超出范围

这是跟踪输出:

Traceback (most recent call last):
  File "tup.py", line 19, in <module>
    print pascal(3)
  File "tup.py", line 15, in pascal
    a = pascal(n-1)[n-2][i] + pascal(n-2)[n-1][i+1]
IndexError: tuple index out of range
回溯(最近一次呼叫最后一次):
文件“tup.py”,第19行,在
打印帕斯卡(3)
文件“tup.py”,第15行,pascal格式
a=pascal(n-1)[n-2][i]+pascal(n-2)[n-1][i+1]
索引器错误:元组索引超出范围

感谢您的帮助,谢谢

以下操作将起作用。在前一行上从0循环到n-2(独占):

def pascal(n):
    if n == 1:  # one base case is enough
        return ((1,),)  # return tuple of tuples to be consistent
    prev = pascal(n-1)
    new_row = [1] + [prev[-1][i]+prev[-1][i+1] for i in range(n-2)] + [1]
    return prev + tuple(new_row)

>>> pascal(2)
((1,), (1, 1))
>>> pascal(3)
((1,), (1, 1), (1, 2, 1))
>>> pascal(4)
((1,), (1, 1), (1, 2, 1), (1, 3, 3, 1))

说明:第n行有n个元素,其中2个是1。因此,n-2个元素是由循环中的适当和形成的,因此是范围。

以下将起作用。在前一行上从0循环到n-2(独占):

def pascal(n):
    if n == 1:  # one base case is enough
        return ((1,),)  # return tuple of tuples to be consistent
    prev = pascal(n-1)
    new_row = [1] + [prev[-1][i]+prev[-1][i+1] for i in range(n-2)] + [1]
    return prev + tuple(new_row)

>>> pascal(2)
((1,), (1, 1))
>>> pascal(3)
((1,), (1, 1), (1, 2, 1))
>>> pascal(4)
((1,), (1, 1), (1, 2, 1), (1, 3, 3, 1))

说明:第n行有n个元素,其中2个是1。因此,n-2个元素是由循环中的适当和组成的,因此是范围。

您可以发布完整的回溯吗?您可以发布您正在使用的输入吗?尝试调试您的输入。特别是,在
else:
之后,打印出
n
i
的值。这会让你知道你在哪里。如果没有提供足够的信息,请打印元组本身的信息(大小、内容等)。我假设您的第二个
If
语句应该是
elif
(n不能同时等于2和1)。这可能会解决问题!pascal(3)回溯(最近一次调用last):文件“”,第1行,在pascal(3)文件“”,第14行,在pascal a=pascal(n-1)[n-2][i]+pascal(n-2)[n-1][i+1]索引器中:元组索引超出范围。您可以发布完整的回溯吗?您可以发布您正在使用的输入吗?尝试调试您的输入。特别是,在
else:
之后,打印出
n
i
的值。这会让你知道你在哪里。如果没有提供足够的信息,请打印元组本身的信息(大小、内容等)。我假设您的第二个
If
语句应该是
elif
(n不能同时等于2和1)。这可能会解决问题!pascal(3)Traceback(最近一次调用last):文件“”,第1行,在pascal(3)文件“”,第14行,在pascal a=pascal(n-1)[n-2][i]+pascal(n-2)[n-1][i+1]索引器中:元组索引超出范围感谢您的帮助,但是有没有不必使用tuple()函数的方法呢,您可以像以前一样继续连接文本,但这在性能方面更糟糕。这只是传递给适当生成器表达式的
tuple
构造函数。@LinJinjia因为它们是不可变的,所以tuple不适合增量构建。如果有的话,您应该继续将
追加到列表中,并在最后将其转换为元组。感谢您的帮助,但是有没有一种方法不必使用tuple()函数?当然,您可以像以前一样继续连接文本,但这在性能方面更糟糕。这只是传递给适当生成器表达式的
tuple
构造函数。@LinJinjia因为它们是不可变的,所以tuple不适合增量构建。如果有的话,您应该将
追加到列表中,并在最后将其转换为元组。