Python 2.7。迭代列表无效

时间:2015-11-20 14:17:39

标签: list python-2.7 iterator collatz

刚开始使用Python并做一些挑战,这是一个关于Collat​​z数字的问题。 然而,我在开始时遇到困难,我传递给collatz方法的范围不是在给定范围内迭代。

我在这里缺少什么?

def collatz(number):
    for i in number:
        if i % 2:
            return i // 2
        else:
            return 3 * (i + 1)


try:
    print(collatz(range(0,10)))
except ZeroDivisionError:
    print("Zero Division")
except TypeError:
    print "Type Error"

3 个答案:

答案 0 :(得分:2)

    for i in range(0,10):
        print(collatz(i))

答案 1 :(得分:2)

算法

  • 如果数字是偶数,则除以2。
  • 如果数字为奇数,则将其加倍并添加一个。

def f(n):
    if n % 2 == 0:
        return n // 2
    else:
        return 3 * n + 1

def a(i, n):
    if i == 0:
        return n
    else:
        return f(a(i - 1, n))

def collatz(n):
    i = 0
    c = 0
    out = []

    while c != 1:
        c = a(i, n)
        out.append(c)
        i += 1
    return out

print(collatz(6))

输出

[6, 3, 10, 5, 16, 8, 4, 2, 1]

答案 2 :(得分:2)

简短回答:'return'语句导致函数在第一次迭代时退出,从而阻止进一步的迭代发生。

答案很长:
以下是代码运行方式的细分。

  • collat​​z(数字)收到一个列表[0,1,... 10]
  • 从0
  • 开始为[0,1,... 10]创建一个循环
  • 1,从i = 0开始
  • 0%2 evals为0,这是False,这意味着我们跳到else语句
  • 我们返回3 *(0 + 1),其评估为3。
  • 我们完成了对collat​​z(号码)的调用

在其他一些人的帖子中回答了正确的方法。