如何将fibonacci序列打印到Python中的第n个数字?

2024-05-15 09:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个家庭作业,我很难完成。我试图写一个程序,输出斐波那契数列的第n个数字。以下是我目前掌握的情况:

def fib():
   n = int(input("Please Enter a number: "))

   if n == 1:
      return(1)
   elif n == 0:   
      return(0)            
   else:                      
      return (n-1) + (n-2)


mylist = range[0:n]
print(mylist)

我想我可以使用单独的函数,但我不知道如何传递计算斐波那契序列的参数。然后下一步将是打印出该数字之前的数字序列。


Tags: 程序numberinputreturnifdef情况序列
3条回答
def fibonacci(n):
  if n <= 1:
    return n
  else:
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(int(input())))

既然你想打印到第n个号码:

[print(fibonacci(n)) for n in range (int(input()))]

对于python2.7,将input更改为raw_input

非递归解

def fib(n):
    cur = 1
    old = 1
    i = 1
    while (i < n):
        cur, old, i = cur+old, cur, i+1
    return cur

for i in range(10):
    print(fib(i))

发电机解决方案:

def fib(n):
    old = 0
    cur = 1
    i = 1
    yield cur
    while (i < n):
        cur, old, i = cur+old, cur, i+1
        yield cur

for f in fib(10):
    print(f)

请注意,生成器解决方案优于非递归解决方案(如果递归解决方案未应用记忆,则非递归解决方案优于递归解决方案)

再来一次,用记忆递归:

def memoize(func):
    memo = dict()
    def decorated(n):
        if n not in memo:
            memo[n] = func(n)
        return memo[n]

    return decorated

@memoize
def fib(n):
    #added for demonstration purposes only - not really needed
    global call_count
    call_count = call_count + 1
    #end demonstration purposes

    if n<=1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

call_count = 0 #added for demonstration purposes only - not really needed
for i in range(100):
    print(fib(i))
print(call_count) #prints 100

这一次每个斐波纳契数计算精确一次,并存储。因此,这个解决方案将优于所有其他方案。然而,decorator实现只是快速而肮脏的,不要让它投入生产。(有关python装饰器的详细信息,请参见this amazing questionon-SO:)

因此,定义了fib之后,程序会变得类似(抱歉,只是循环很无聊,这里有一些更酷的python内容:list comprehensions

fib_n = int(input("Fib number?"))
fibs = [fib(i) for i in range(fib_n)]
print " ".join(fibs) 

这会将所有数字打印成一行,用空格隔开。如果您希望每一个都在自己的行上-用"\n"替换" "

请注意,在你的电话里

  1. 您不是递归调用fib()
  2. 您需要一个包装器方法,这样就不会每次递归调用该方法时都请求输入
  3. 您不需要发送列表。只要数字n就足够了。

这个方法只给你序列中的第n个数字。它不会打印序列。

你需要return fib(n-1) + fib(n-2)

def f():
    n = int(input("Please Enter a number: "))
    print fib(n)

def fib(n):    
    if n == 0: 
        return 0
    elif n == 1: 
        return 1
    else: 
        return fib(n-1)+fib(n-2)

相关问题 更多 >