0

このプログラムの目的は、関数 'Fib' が 2 つの値を取り、それらをフィボナッチ数列に通し、変数 'sequence' に項を追加することです。'check' 関数を通過して Limit Reached を返すと、リスト 'final' に偶数の値が追加され、ループ後に 'final' の合計が出力されます。

問題は、Fib がどのような値を取り込んでも、'final' は常に値がないことです。私はプログラミングに非常に慣れていないため、なぜこれを行っているのか理解できないようです...

def even(x):
    v = list(str(x))[-1]
    if v == '0' or v == '2' or v == '4' or v == '6' or v == '8':
        return x
    else:
        return 0 
def check(sequence):
    for v in sequence:
        if v >= 20:
            return 'Limit Reached'
        else:
            return None

def Fib(x,y):
    sequence = [x,y]
    a = 0
    b = 1
    final = []
    while len(sequence) < 100:
        term = sequence[a] + sequence[b]
        sequence.append(term)
        if check(sequence) == 'Limit Reached':
            for v in sequence:
                final.apppend(even(v))
            print sum(final)
            break
        a += 1
        b += 1
4

5 に答える 5

4

checkNoneリストの最初の項目が 20 未満の場合は常に返されます。

あなたはおそらく次のことを意味していました:

def check(sequence):
    for v in sequence:
        if v >= 20:
            return 'Limit Reached'
    else:
        return None
于 2012-07-09T21:28:40.157 に答える
2

このコードにはいくつかの問題があります。私は次のように書いたでしょう:

def even(x):
    # is the modulo operator, it's used to calculate a remainder
    return x % 2 == 0

def check(sequence):
    # you need to check all the values, not just the first one
    return max(sequence) >= 20

def Fib(x, y):
    sequence = [x, y]

    while len(sequence) < 100:
        # it's not necessary to keep a and b around, you can use 
        # negative indices instead
        sequence.append(sequence[-2] + sequence[-1])

        if check(sequence):
            # this is called a "generator comprehension"
            print sum(v for v in sequence if even(v))
            break

さらに単純化することはまだ可能ですが、この構造は独自のものと一致します。sequence実行中の合計を維持できるため、実際には維持する必要さえありませんが、この方法で実行する方が有益であると考えました.

于 2012-07-09T21:37:18.563 に答える
1

final を返さないため、ローカル変数であるため、 Fib() を呼び出すたびに値がクリアされます。期待どおりの結果が出力されるはずですよね?

于 2012-07-09T21:28:23.720 に答える
0

たぶんあなたはもっと簡単なものが欲しいでしょう:

def fib(a, b, iterations = 20):
    result = 0
    if not (a & 1): result += a
    if not (b & 1): result += b
    for x in xrange(iterations):
        nextval = a + b
        if not (nextval & 1):
            result += nextval
        a = b
        b = nextval
    return result
于 2012-07-09T21:38:38.740 に答える
0

Python は、ほとんどの言語とは異なり、このようなタイプミスで実行時エラーをスローします (プログラムをまったくコンパイルしないのとは対照的に)。

 final.apppend(even(v))

実行時エラーが表示されないことは、周囲のif条件が満たされないことを示していcheckます。これは、シーケンス全体をチェックするのではなく、シーケンスの最初の項目がチェックされた直後にメソッドが返されるためです。

于 2012-07-09T21:31:59.000 に答える