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

アルゴリズム

  • 偶数の場合は2で割ります。
  • 奇数なら3倍にして1足すればいい。

コード

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 回の評価で 0 になります。これは False です。これは、else ステートメントにスキップすることを意味します。
  • 3 * (0 + 1) を返し、これは 3 に評価されます。
  • collat​​z(number) への呼び出しを終了します

正しいアプローチは、他の人々の投稿で回答されています。

于 2015-11-20T14:25:19.673 に答える