Python Fibonacci Generator
我需要做一个程序,要求打印的斐波那契数的数量,然后像0,1,1,2…但我不能让它工作。我的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | a = int(raw_input('Give amount: ')) def fib(): a, b = 0, 1 while 1: yield a a, b = b, a + b a = fib() a.next() 0 for i in range(a): print a.next(), |
我会用这种方法:
Python 2
1 2 3 4 5 6 7 8 9 | a = int(raw_input('Give amount: ')) def fib(n): a, b = 0, 1 for _ in xrange(n): yield a a, b = b, a + b print list(fib(a)) |
Python 3
1 2 3 4 5 6 7 8 9 | a = int(input('Give amount: ')) def fib(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + b print(list(fib(a))) |
你给
1 | a = int(raw_input('Give amount: ')) |
VS
1 | a = fib() |
如果给变量赋予更具描述性的名称(在10行代码中使用3种不同的名称
1 | amount = int(raw_input('Give amount: ')) |
将
既然你在写一个生成器,为什么不使用两个收益率来节省额外的洗牌时间呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 | import itertools as it num_iterations = int(raw_input('How many? ')) def fib(): a,b = 0,1 while True: yield a b = a+b yield b a = a+b for x in it.islice(fib(), num_iterations): print x |
…
将斐波那契数列打印到n号的简单方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def Fib(n): i=a=0 b=1 while i<n: print (a) i=i+1 c=a+b a=b b=c Fib(input("Please Enter the number to get fibonacci series of the Number : ")) |
要用生成器得到任意数(在本例中是100)之前的斐波那契数,可以这样做。
1 2 3 4 5 6 7 8 9 10 11 12 | def getFibonacci(): a, b = 0, 1 while True: yield b b = a + b a = b - a for num in getFibonacci(): if num > 100: break print(num) |
1 2 3 4 5 | def fibonacci(n): fn = [0, 1,] for i in range(2, n): fn.append(fn[i-1] + fn[i-2]) return fn |
你有一个正确的想法和一个非常优雅的解决方案,你需要做的就是你的交换和添加A和B的语句。你的收益率语句也应该在你的交换之后进行。
1 | `###yield a` |
此外,您还可以尝试封闭形式的解决方案(由于舍入/溢出错误,无法保证非常大的n值):
1 2 3 4 5 | root5 = pow(5, 0.5) ratio = (1 + root5)/2 def fib(n): return int((pow(ratio, n) - pow(1 - ratio, n))/root5) |
还可以使用枚举无限生成器:
1 2 3 | for i,f in enumerate(fib()): print i, f if i>=n: break |
python是一种动态类型语言。变量的类型在运行时确定,并且可以随着执行的进行而变化。在这里,您首先声明了一个保存整数类型的函数,然后为它分配了一个函数,因此它的类型现在变成了一个函数。
您正在尝试将"a"作为参数应用于range()函数,该函数需要int参数,但实际上您提供了一个函数变量作为参数。
正确的代码应该是
1 2 3 4 5 6 7 8 9 10 11 12 13 | a = int(raw_input('Give amount: ')) def fib(): a, b = 0, 1 while 1: yield a a, b = b, a + b b = fib() b.next() for i in range(a): print b.next(), |
这会起作用
你的
1 | a = int(raw_input('Give amount: ')) |
每当python看到一个
我喜欢这个版本:
1 2 3 4 5 6 7 | array = [0,1] for i in range(20): x = array[0]+array[1] print(x) array[0] = array[1] array[1] = x |
你好像用了两次
以下内容似乎对我很有用。
1 2 3 4 5 6 7 8 9 | def fib(): a, b = 0, 1 while True: yield a a, b = b, a+b f = fib() for x in range(100): print(f.next()) |
我刚才建了这个:
1 2 3 4 5 6 7 8 9 10 | a = int(raw_input('Give amount: ')) fab = [0, 1, 1] def fab_gen(): while True: fab.append(fab[-1] + fab[-2]) yield fab[-4] fg = fab_gen() for i in range(a): print(fg.next()) |
不,随着时间的推移,
以下是生成fiboncci的两种解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | def fib_generator(num): ''' this will works as generator function and take yield into account. ''' assert num > 0 a, b = 1, 1 while num > 0: yield a a, b = b, a+b num -= 1 times = int(input('Enter the number for fib generaton: ')) fib_gen = fib_generator(times) while(times > 0): print(next(fib_gen)) times = times - 1 def fib_series(num): ''' it collects entires series and then print it. ''' assert num > 0 series = [] a, b = 1, 1 while num > 0: series.append(a) a, b = b, a+b num -= 1 print(series) times = int(input('Enter the number for fib generaton: ')) fib_series(times) |