-2

私はプロジェクト Euler problem 2 を始めたばかりで、誰かがこのスクリプトを修正するのを手伝ってくれるかどうか疑問に思っていました:

def fib():
    x,y = 0,1
    while True:
        yield x
        x,y = y, x+y

def even(seq):
    for number in seq:
        if not number % 2:
            yield number

def under_a_million(seq):
    for number in seq:
        if number > 4000000:
            break
        yield number   

print sum(even(under_a_million(fib())))

このコードは、100 万までのすべてのフィボナッチ数の合計を見つけることになっています。現在、7行目で問題が発生しています。

4

3 に答える 3

1

Seamonkeyこんにちは、SOへようこそ。前回よりもこの質問に力を入れてくださったことをうれしく思います:)

私はあなたと一緒にコードを段階的に見ていきます。単純な問題の場合、グローバル変数を処理する必要があるときに関数が煩わしい可能性があるため、関数を使用しない方が簡単であることがわかります。

#This part of the code gets the entire fibonacci sequence
list_of_numbers = []
even_fibs = []
x,y = 0,1 #sets x to 0, y to 1
while y <= 4000000: #Gets numbers till 4 million
    list_of_numbers.append(y)
    x, y = y, x+y #updates the fib sequence

このコードブロックでは(必要に応じて関数に変更できます)、最大400万の完全なフィボナッチ数列を計算します。また、2つのリストとを作成しlist_of_numbersますeven_fibs。1つ目は完全なシーケンスを格納するために使用され、2つ目は偶数を格納するために使用されます。次のブロックに進みます。

coord = 0
for number in range(len(list_of_numbers)):
    test_number = list_of_numbers [coord]

    if (test_number % 2) == 0:
        even_fibs.append(test_number)
    coord+=1

ここで、リスト内の数値list_of_numbersが偶数であるかどうかをテストしました。もしそうなら、私はそれらをeven_fibsリストに追加しました。ここでリストを読むことができます。

print "Normal:  ", list_of_numbers #outputs full sequence
print "\nEven Numbers: ", even_fibs #outputs even numbers
print "\nSum of Even Numbers:  ", sum(even_fibs) #outputs the sum of even numbers

これは単に私たちの調査結果を出力します。


関数が好きなようですので、ここにコードを追加しました。説明は上と同じです。

#This part of the code gets the entire fibonacci sequence
list_of_numbers = []
even_fibs = []

def fib(list_of_numbers):

    x,y = 0,1 #sets x to 0, y to 1
    while x+y <= 4000000: #Gets numbers till 4 million
        list_of_numbers.append(y)
        x, y = y, x+y #updates the fib sequence
    return list_of_numbers

def even(list_of_numbers, even_fibs):
    coord = 0
    for number in range(len(list_of_numbers)):
        test_number = list_of_numbers [coord]

        if (test_number % 2) == 0:
            even_fibs.append(test_number)
        coord+=1
    return even_fibs

fib(list_of_numbers) #call fib function

even(list_of_numbers, even_fibs) #Call the even function
#Output
print "Normal:  ", list_of_numbers
print "\nEven Numbers: ", even_fibs
print "\nSum of Even Numbers:  ", sum(even_fibs)
于 2013-03-01T02:18:27.917 に答える
1

コードは問題なく実行できます。
少なくとも私の版の後のバージョン。

コードでエラーが発生した場合、それはおそらく間違ったインデントが原因ですか? このコードを問題なく実行します。

注、問題は「値が400 万を超えないフィボナッチ数列で、偶数項の和を求める」です。

そう

def fib():
    x,y = 0,1
    while True:
        yield x
        x,y = y, x+y

def even(seq):
    for number in seq:
        if not number % 2:
            yield number

def under_a_million(seq):
    for number in seq:
        if number > 4000000: # <------------
            break
        yield number   

print sum(even(under_a_million(fib())))

ところで、発電機が使用されているのを見るのは良いことです。Haskell での遅延評価のようなものです :)

于 2013-03-01T01:50:10.327 に答える
1

以下は、オイラー 2 チャレンジの簡単な関数です。Python 3.0 では、何らかの洞察が得られることを願っています。

def sum_even_fib(n):#n is the upper_limit value for item in fib list
    list_numbers=[]
    a,b=0,1#initializing
    while b<n:#exits if condition fail
        list_numbers.append(b)
        a,b=b,a+b
    even_fib =[i for i in list_numbers if i%2==0]
    result=sum(even_fib)
    return result
于 2018-05-19T07:41:23.530 に答える