Python 我尝试使用递归来解决所谓的Tribonaci序列问题

Python 我尝试使用递归来解决所谓的Tribonaci序列问题,python,recursion,Python,Recursion,该函数应该像 Tribonaci([1,1,1],10)->[1,1,1,3,5,9,17,31,57,105] 这是我的密码 def tribonacci(signature, n): if n <= 3: return signature[:3] else: return tribonacci(signature, n-1).append(sum(tribonacci(signature, n-1)[-3:])) def tribona

该函数应该像 Tribonaci([1,1,1],10)->[1,1,1,3,5,9,17,31,57,105]

这是我的密码

def tribonacci(signature, n):
    if n <= 3:
        return signature[:3]
    else:
        return tribonacci(signature, n-1).append(sum(tribonacci(signature, n-1)[-3:]))
def tribonacci(签名,n):
如果n如@JonClements已经在注释中指出的,则
append
方法不会返回列表。它返回
None
,因此调用方在尝试将该
None
用作列表时将遇到异常

顺便说一句,进行两次相同的递归调用是低效的。这将使您的程序再次执行所有相同的工作

因此,要解决这两个问题,请一步一步地进行,如下所示:

def tribonacci(signature, n):
    if n <= 3:
        return signature[:3]
    else:
        result = tribonacci(signature, n-1)
        result.append(sum(result[-3:]))
        return result

如果此函数将使用不同的n值(但签名相同)被多次调用,那么如果实现memonization,那么效率将得到提高,以便可以重用早期的结果。

。append
不会返回新列表,它会修改现有列表并返回
None
。。。然后,您必须小心该
列表的默认可变参数,然后确保递归条件是正确的。。。试着看看你是否能在没有第一个问题的情况下让它工作,然后从那里开始。。。(这里有很多事情需要指出,你可能会犯错误,你需要理解一些概念……)非常感谢!你的评论真的很有帮助。
def tribonacci(signature, n):
    if n <= 3:
        return signature[:3]
    else:
        result = tribonacci(signature, n-1)
        return result + [sum(result[-3:])]

print(tribonacci([1,1,1], 10))