【问题标题】:How do I print a fibonacci sequence to the nth number in Python?如何在 Python 中将斐波那契数列打印到第 n 个数字?
【发布时间】:2013-03-27 01:57:53
【问题描述】:

我有一个家庭作业让我很难过。我正在尝试编写一个程序,将斐波那契数列输出到第 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)

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

【问题讨论】:

    标签: python parameter-passing fibonacci


    【解决方案1】:

    非递归解决方案

    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
    

    这一次每个斐波那契数计算准确一次,然后存储。因此,此解决方案将胜过所有其他解决方案。然而,装饰器的实现既快又脏,不要让它进入生产环境。 (有关 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"

    【讨论】:

    • @JOHN 感谢您提供如此全面而全面的答案。我现在要熬夜玩装饰器了!
    【解决方案2】:
    def fibonacci(n):
      if n <= 1:
        return n
      else:
        return fibonacci(n-1) + fibonacci(n-2)
    
    print(fibonacci(int(input())))
    

    既然你想打印到nth 号码:

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

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

    【讨论】:

      【解决方案3】:

      请注意,在您的通话中

      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)
      

      【讨论】:

        【解决方案4】:

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

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

        输出

        1 :  1
        2 :  1
        3 :  2
        4 :  3
        5 :  5
        6 :  8
        7 :  13
        8 :  21
        9 :  34
        10 :  55
        

        【讨论】:

          【解决方案5】:
          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)
          

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

          【讨论】:

            【解决方案6】:

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

            递归::

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

            【讨论】:

              【解决方案7】:

              对于递归解决方案:

              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,那么“第 0”项当然为 0,第 1 项为 1。从这里,您知道下一个数字将是前两个数字的总和。这就是 else 之后的行所推断的。

              【讨论】:

                【解决方案8】:

                看起来您可能正在尝试解决与我相同的家庭作业问题,您实际上并不需要用户输入。调用函数时传入参数即可。

                
                def compute_nth_fib(num):
                   
                    if num == 0:
                        return 0
                    elif num == 1:
                        return 1
                    else:
                        return compute_nth_fib(num-1) + compute_nth_fib(num-2)
                
                #test with different parameters    
                print(compute_nth_fib(3))
                

                希望对某人有所帮助!

                【讨论】:

                  猜你喜欢
                  • 2021-06-14
                  • 1970-01-01
                  • 2022-12-10
                  • 1970-01-01
                  • 2022-11-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-10-12
                  • 1970-01-01
                  相关资源
                  最近更新 更多