1

刚从 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"
4

3 回答 3

2
    for i in range(0,10):
        print(collatz(i))
于 2015-11-20T14:22:54.243 回答
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]
于 2015-11-20T14:25:02.253 回答
2

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

长答案:
这是您的代码运行方式的细分。

  • collat​​z(number) 接收列表 [0,1,...10]
  • 从 0 开始为 [0,1,...10] 创建一个循环
  • 第一,从 i = 0 开始
  • 0 % 2 evals 为 0,即为 False,表示我们跳到 else 语句
  • 我们返回 3 * (0 + 1),其计算结果为 3。
  • 我们完成了对 collat​​z(number) 的调用

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

于 2015-11-20T14:25:19.673 回答