Python 斐波那契生成器

2025-04-10 09:45:00
admin
原创
22
摘要:问题描述:我需要编写一个程序,要求打印斐波那契数的数量,然后打印它们,如 0、1、1、2……但我无法让它工作。我的代码如下所示:a = int(raw_input('Give amount: ')) def fib(): a, b = 0, 1 while True: yie...

问题描述:

我需要编写一个程序,要求打印斐波那契数的数量,然后打印它们,如 0、1、1、2……但我无法让它工作。我的代码如下所示:

a = int(raw_input('Give amount: '))

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

a = fib()
a.next()
0
for i in range(a):
    print a.next(),


解决方案 1:

我会用这种方法:

Python 2

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

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)))

解决方案 2:

你给出了a太多含义:

a = int(raw_input('Give amount: '))

对阵

a = fib()       

a如果你给变量赋予更具描述性的名称( 10 行代码中3 种不同的名称用法!),则不会(经常)遇到问题:

amount = int(raw_input('Give amount: '))

并更改range(a)range(amount)

解决方案 3:

既然你正在编写一个生成器,为什么不使用两个收益来节省额外的洗牌呢?

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

.....

解决方案 4:

使用生成器真的很简单:

def fin(n):
    a, b = 0, 1

    for i in range(n):
        yield a
        a, b = b, a + b


ln = int(input('How long? '))
print(list(fin(ln))) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...]

解决方案 5:

Python 是一种动态类型语言。变量的类型在运行时确定,并且会随着执行的进行而变化。首先,您声明了一个变量来保存整数类型,然后您为其分配了一个函数,因此它的类型现在变成了一个函数。

您正尝试将“ a ”作为参数应用于range()函数,该函数需要一个 int arg,但实际上您提供了一个函数变量作为参数。

更正后的代码应为

 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(),

这会起作用

解决方案 6:

def fibonacci(n):
    fn = [0, 1,]
    for i in range(2, n):
        fn.append(fn[i-1] + fn[i-2])
    return fn

解决方案 7:

要使用生成器获取任意数字(在本例中为 100)的斐波那契数列,您可以这样做。

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)

解决方案 8:

def genFibanocciSeries():

    a=0
    b=1
    for x in range(1,10):
        yield a
        a,b = b, a+b

for fib_series in genFibanocciSeries():
    print(fib_series)

解决方案 9:

a可以这么说,您的名字是全球性的。

a = int(raw_input('Give amount: '))

每当 Python 看到 时a,它就认为你正在谈论上面的那个。将其命名为其他名称(其他地方或此处)应该会有所帮助。

解决方案 10:

您还可以使用枚举无限生成器:

for i,f  in enumerate(fib()):
    print i, f
    if i>=n: break

解决方案 11:

您也可以尝试闭式解决方案(由于舍入/溢出错误,无法保证 n 的值非常大):

根5 = pow(5,0.5)
比率 = (1 + 根5)/2

定义 fib(n):
    返回 int((pow(ratio, n) - pow(1 - ratio, n))/root5)

解决方案 12:

你的想法很正确,解决方案也非常优雅,你需要做的就是修复 a 和 b 的交换和添加语句。你的收益语句也应该在交换之后

a, b = b, a + b ####应该是a,b = a+b,a #####

`###yield a`

解决方案 13:

打印斐波那契数列直到 n 数的简单方法

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 :  "))

解决方案 14:

a = 3 #raw_input

def fib_gen():
    a, b = 0, 1
    while 1:
        yield a
        a, b = b, a + b

fs = fib_gen()
next(fs)
for i in range(a):
    print (next(fs))

解决方案 15:

我最近发现了这种类型的构造(非常感谢@KellyBundy),所以我无法抗拒:

n = 20
fib = (a for a,b in [(0,1)] for _ in range(n) for a,b in [(b,a+b)])

print(list(fib))
# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

解决方案 16:

我不久前就建好了它:

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())

不会fab,随着时间的推移它会增长,所以这不是一个完美的解决方案。

解决方案 17:

看起来您使用了a两次。请尝试将其更改为其他变量名。

以下内容对我来说似乎很有效。

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())

解决方案 18:

我喜欢这个版本:

array = [0,1]

for i in range(20):
   x = array[0]+array[1]   
   print(x)
   array[0] = array[1]
   array[1] = x

解决方案 19:

以下是斐波那契生成的两种解决方案:

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)

解决方案 20:

你为什么要选择复杂的,这是我要处理的片段之一!!

n = int(input('Enter your number..: '))
a = 0
b = 1
c = 0
print(a)
print(b)
for i in range(3, n+1):
    c = a+b
    print(c)
    a,b=b,c 

查看我的 git - rohith-sreedharan

解决方案 21:

编写以下代码:

nterm = int(input("How many Fibonacci numbers do you want to find out? "))
n1 = 0
n2 = 1

fibonacciList = [
    n1,
    n2
]

if nterm >= 1:
    for i in range(nterm):
        fibonacciList.insert(
            len(fibonacciList),
            fibonacciList[-1] + fibonacciList[-2]
        )

    print(fibonacciList[0:len(fibonacciList) - 2])
else:
    print("Invalid value")

len表示长度。

解决方案 22:

我们可以简单地使用它,而不需要通过 'yield' 和 'next' 语句

def fib(n):
    return n if n <= 1 else fib(n - 1) + fib(n - 2)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用