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

时间:2013-04-04 19:59:23

标签: python parameter-passing fibonacci

我有一份我难以理解的家庭作业。我正在尝试编写一个程序,在第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)

我想我可以使用单独的函数,但我无法弄清楚如何传递计算斐波纳契数列的参数。然后下一步是打印出该数字的数字序列。

7 个答案:

答案 0 :(得分:17)

非递归解决方案

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)

请注意,如果memoization不应用于递归解决方案,则生成器解决方案优于非递归(并且非递归优于递归方式)

再一次,通过memoization递归:

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

这次每个 fibbonacci数字计算完全一次,然后存储。因此,这个解决方案将胜过其余所有。然而,装饰器实现只是快速而肮脏,不要让它投入生产。 (有关python装饰器的详细信息,请参阅SO上的this amazing question:)

所以,如果定义了fib,程序就会像(抱歉,循环很无聊,这里有一些更酷的python东西:list comprehensions

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

这会打印一行中的所有数字,用空格分隔。如果您希望每个人都有自己的行 - 请将" "替换为"\n"

答案 1 :(得分:5)

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

答案 2 :(得分:3)

请注意,在您的通话中

  1. 你不是递归地调用fib()
  2. 您需要一个包装器方法,以便每次递归调用该方法时都不会请求输入
  3. 您无需发送列表。只有数字n就够了。
  4. 此方法仅提供序列中的第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)
    

答案 3 :(得分:2)

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

my_num = int(input("Enter a number:"))
print fib(my_num)

我不确定你的问题是什么......但答案可能是这样的

答案 4 :(得分:2)

单独的函数最好,因为递归函数更容易处理。另一方面,您可以编写一个只需要一个参数的迭代函数

递归::

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

def callFib():
    n = int(raw_input('Enter n::\t'));
    mylist = fib(n);
    print mylist;

callFib();

迭代::

def fib():
    n = int(raw_input('Enter n::\t'));
    terms = [0,1];
    i=2;
    while i<=n:
        terms.append(terms[i-1] + terms[i-2]);
        i=i+1;
    print terms[n];

fib();

答案 5 :(得分:2)

用于递归解决方案:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
x=input('which fibonnaci number do you want?')
print fib(x)

说明: 如果n为0,则当然'0th'项为0,第1项为1。从这里开始,您知道下一个数字将是前一个数字的总和。这就是在else之后的行所推断的。

答案 6 :(得分:2)

如果列表很长,这可能会更快输出

# Get nth Fibonacci number 
def nfib(nth):
  sq5 = 5**.5
  phi1 = (1+sq5)/2
  phi2 = -1 * (phi1 -1)
  resp = (phi1**(nth+1) - phi2**(nth+1))/sq5
  return long(resp)

for i in range(10):
  print i+1, ": ",  nfib(i)