我对编程比较陌生,我试图使用这个公式生成一个数字列表。
如果"我"是列表的索引,公式将是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.etc。要获得每个数字(在1,1,1之后),您可以跳过一个数字,然后取前两个数字的总和,例如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个这些数字的列表。有没有人有什么建议? 谢谢!
答案 0 :(得分: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
允许的非常普遍可扩展的形式主义相结合。
答案 1 :(得分:1)
我会使用发电机:
def sequence(start):
a, b, c = start
yield a
yield b
while True:
yield c
a, b, c = b, c, a + b
由于发电机将继续运行,你必须以某种方式停止:
for i, n in enumerate(sequence([1, 1, 1])):
if i > 100:
break
print n
或itertools
:
from itertools import islice:
for n in islice(sequence([1, 1, 1]), 100):
print n
答案 2 :(得分:0)
这样的事情:
def solve(n):
lis=[1,1,1]
if n<=3:
return lis[:n]
while len(lis)!=n:
lis.append(lis[-2]+lis[-3])
return lis
print solve(20)
<强>输出:强>
[1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151]