繁体   English   中英

如何在 Python 中将斐波那契数列打印到第 n 个数字?

[英]How do I print a fibonacci sequence to the nth number in 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)

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

非递归解决方案

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

这一次,每个fibbonacci数精确计算一次,并存储比。 因此,此解决方案将胜过所有其他解决方案。 然而,装饰器实现只是快速而肮脏,不要让它投入生产。 (有关 Python 装饰器的详细信息,请参阅 SO 上的这个惊人问题:)

因此,定义fib ,程序将类似于(抱歉,只是循环很无聊,这里有一些更酷的 Python 内容:列表理解

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

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

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

请注意,在您的通话中

  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)

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

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

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

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

递归::

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

对于递归解决方案:

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 之后的行推断出的。

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


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

希望这对某人有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM