在Python中生成递归tribonaci序列

2024-05-15 20:57:38 发布

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

我应该在Python中创建一个函数来生成tribonaci序列。此函数必须递归。基于此,目前我有以下代码:

def TribRec(n) :
    if (n == 0 or n == 1 or n == 2) :
        return []
    elif (n == 3) :
        return [0,1][:n]
    else :
        sequence = TribRec(n-1)
        sequence.append(sequence[len(sequence)-1] + 
        sequence[len(sequence)-2] + sequence[len(sequence)-3])
        return sequence


def Trib(n) :
    for i in range(1, n) :
        print( TribRec(i) , " ", end = "")

# Driver code
n = 10
Trib(n)

运行此代码时,我得到以下输出:

^{pr2}$

相反,我需要length=n的输出,这里是10,形式如下:

[0, 1, 2, 3, 6, 11, 20, 37, 68, 125]

如何修复当前代码?在


Tags: or函数代码lenreturnifdef序列
3条回答

不是在每次递归调用中都返回列表,而是返回第n个元素并在Trib函数上聚合列表:

def TribRec(n) :
    if n == 0:
        return 0
    elif n == 1:
        return 1
    elif n == 2:
        return 2
    else :
        return TribRec(n-1) + TribRec(n-2) + TribRec(n-3)


def Trib(n) :
    l = []
    for i in range(0, n) :
        l.append(TribRec(i)) 
    return l
# Driver code
n = 10
Trib(n)

这要简单得多:

def trib(n):
    if n < 3:
        return n
    return trib(n-1) + trib(n-2) + trib(n-3)

def tri(n):
    result = []
    for i in range(0,n):
        result.append(trib(n))
    return result

您的代码可以写得更简洁,如下所示。在

def TribRec(n) :
    if n in {0, 1, 2}:
        return n
    else :
        return TribRec(n-1) + TribRec(n-2) + TribRec(n-3)

def Trib(n) :
    for i in range(0, n) :
        yield TribRec(i)

res = list(Trib(10))

# [0, 1, 2, 3, 6, 11, 20, 37, 68, 125]

说明

  • 根据@czr's solution,您可以递归地将最后3个调用求和为TribRec。在
  • 如果它属于集合{0, 1, 2},则返回n。在
  • 对于Trib(n),使用生成器删除样板代码(列表实例化,附加到列表)。在

相关问题 更多 >