【问题标题】:Change starting values of an iteration in a sequence Python更改序列 Python 中迭代的起始值
【发布时间】:2012-11-19 23:21:57
【问题描述】:
fibs = {0: 0, 1: 1}
def fib(n):
    if n in fibs: return fibs[n]
    if n % 2 == 0:
        fibs[n] = ((2 * fib((n / 2) - 1)) + fib(n / 2)) * fib(n / 2)
        return fibs[n]
    else:
        fibs[n] = (fib((n - 1) / 2) ** 2) + (fib((n+1) / 2) ** 2)
        return fibs[n]


def test(n):
    count = range(0,n)
    seq = []
    for i in count:
        seq.append(fib(i))
    return seq

print test(10)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

如何让它从 1 而不是 0 开始所以结果是

[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

我尝试将 fibs 更改为 {1:1,2:2},但没有成功

【问题讨论】:

  • 您可以将count = range(0, n) 替换为count = range(2, n+2) 以获得预期的输出。

标签: python function recursion iteration return-value


【解决方案1】:

您可以将 count = range(0, n) 替换为 count = range(2, n+2) 以获得预期的输出。 -

通过

尼古拉斯

def test(n):
    count = range(2,n+2)
    seq = []
    for i in count:
        seq.append(fib(i))
    return seq

谢谢!

【讨论】:

    【解决方案2】:

    你可以做两件事。假设您的结果存储在 fibonacciNumbers 中。 一种选择是对列表进行切片:

    fibonacciNumbers[2:]
    

    第二个选项是简单地从 fibonacciNumbers 中弹出第一个元素。

    for i in range(2):
        fibonacciNumbers.pop(0)
    

    【讨论】:

    • 只有一点点效率;弹出列表的第一项需要在内存中向下移动所有其他项,实际上是复制所有项。
    • 你是对的。相反,collection.deque 对于末尾的添加/删除操作更有意义。我的意思是在双端队列中添加/删除是 O(1)。我有一个误解,认为 python 的列表是一个链表实现。无论如何,我没有注明我的答案。感谢您的澄清。
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多