7

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

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

4

8 回答 8

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)

请注意,生成器解决方案优于非递归解决方案(如果记忆化不适用于递归解决方案,非递归优于递归解决方案)

再一次,用记忆递归:

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 上的这个惊人的问题:)

因此,fib定义后,程序将类似于(抱歉,只是循环很无聊,这里有一些更酷的 python 东西:列表推导

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

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

于 2013-04-04T20:14:39.077 回答
6
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 更改inputraw_input.

于 2013-04-04T20:08:18.720 回答
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)
于 2013-04-04T20:01:37.130 回答
3

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

# 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
于 2014-08-04T20:35:17.497 回答
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)

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

于 2013-04-04T20:02:17.763 回答
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();
于 2013-04-04T20:17:47.083 回答
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,那么“第 0”项当然为 0,第 1 项为 1。从这里,您知道下一个数字将是前两个数字的总和。这就是 else 之后的行所推断的。

于 2013-04-11T13:47:57.427 回答
0

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


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-01-14T22:05:55.480 回答