0

私はプログラミングに比較的慣れていないので、この式を使用して数値のリストを生成しようとしています。

「i」がリストのインデックスの場合、式は list[i] = list[i-2] + list[i-3] になります。1,1,1 から始めた場合、最初のいくつかの数字は次のようになります。

1,1,1,2,2,3,4,5,7,9,12,16,21,28,37,49,65,86など。各数値を取得するには (1,1,1 の後)、1 つの数値をスキップして、前の 2 つの数値の合計を取得します (例: 49 は 21 と 28 の合計から)。

数字を見つけるプロセスはフィボナッチに似ていますが、これらの数字は世界が異なります。

私のコードは次のようになります。

start = [1,1,1] #the list must start with three 1's
list1 = start #list1 starts with 'start'
newList = []
ammountOfNumbers = int(raw_input("Enter the ammount of numbers to be generated(n >= 3): "))# to dictate length of generated list


def generateList(newList, aList, ammountOfNumbers, *a):
    while len(aList) <= ammountOfNumbers: #while length of list is less than or = size of list you want generated
        for x in range((ammountOfNumbers-1)):
            newList.append(x) #this puts value of x in index '0' 
            newList[x] = aList[len(aList)-1] + aList[len(aList)-2] # generate next number
            aList += newList #add the next generated number to the list
            x+=1
        print
        #print "Inside: ", aList #test
        #print "Length inside: ",len(aList) #test
        print
        return aList


final = generateList(newList, list1, ammountOfNumbers) # equal to the value of list1
print"Final List: " , final
print
print"Length Outside: ", len(final) #wrong value

現在、明らかに正しく動作していません。これらの数字の約 500 のリストを生成できることを望んでいます。誰か提案はありますか?ありがとう!

4

3 に答える 3

1

私はジェネレーターを使用します:

from collections import deque
def generate_list():
    que = deque([1,1,1],3)
    yield 1
    yield 1
    yield 1
    while True:
        out = que[-3]+que[-2]
        yield out
        que.append(out)

これにより、その再帰関係に従って無限のシリーズが生成されます。切り捨てるには、 を使用しますitertools.islice。または、必要な最大数になるように数値を渡し、適切な回数だけループすることもできます。


一般的な再帰関係関数を作成するには、次のようにします。

def recurrence_relation(seed,func):
    seed = list(seed)
    que = deque(seed,len(seed))
    for x in seed:
        yield seed
    while True:
        out = func(que)
        yield out
        queue.append(out)

これを問題に使用するには、次のようになります。

series = recurrence_relation([1,1,1],lambda x:x[-3] + x[-2])
for item in islice(series,0,500):
    #do something

これは、Blender によって提案された優れた「シード」機能と、deque私が最初に提案したように allow を使用する非常に一般的にスケーラブルな形式を組み合わせていると思います。

于 2013-04-28T23:25:32.660 に答える