Как написать последовательность Фибоначчи? - PullRequest
130 голосов
/ 30 января 2009

Я изначально неправильно запрограммировал программу. Вместо того, чтобы возвращать числа Фибоначчи между диапазонами (т.е. startNumber 1, endNumber 20 должен = только те числа между 1 и 20), я написал для программы, чтобы отобразить все числа Фибоначчи между диапазонами (то есть. StartNumber 1, endNumber 20 отображает = первые 20 чисел Фибоначчи). Я думал, что у меня был безошибочный код. Я тоже не понимаю, почему это происходит.

startNumber = int(raw_input("Enter the start number here "))
endNumber = int(raw_input("Enter the end number here "))

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

print map(fib, range(startNumber, endNumber))

Кто-то указал в моей части II (которая была закрыта за дублирование - https://stackoverflow.com/questions/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii)), что мне нужно передать startNumber и endNumber через генератор, используя цикл while. Может кто-нибудь указать мне направление о том, как это сделать? Любая помощь приветствуется.


Я учусь на программиста и столкнулся с небольшим количеством беспорядка. Меня просят написать программу, которая будет вычислять и отображать последовательность Фибоначчи по введенному пользователем начальному номеру и конечному номеру (т. Е. StartNumber = 20 endNumber = 100, и он будет отображать только числа между этим диапазоном). Хитрость заключается в том, чтобы использовать его включительно (что я не знаю, как это сделать в Python? - я предполагаю, что это означает использовать инклюзивный диапазон?).

То, что я имею до сих пор, это не настоящее кодирование, а:

  • Запись формулы последовательности Fib в бесконечное число
  • Отображение startNumber to endNumber только из последовательности Fib.

Я понятия не имею, с чего начать, и я прошу идеи или понимание того, как это написать. Я также пытался написать форумную последовательность Фибоначчи, но я тоже заблудился.

Ответы [ 43 ]

1 голос
/ 29 августа 2016

рекурсия добавляет время. Чтобы устранить петли, сначала import math. Затем используйте math.sqrt и золотое сечение в функции:

#!/usr/bin/env python3

import math

def fib(n):
    gr = (1 + math.sqrt(5)) / 2
    fib_first = (gr**n - (1 - gr)**n) / math.sqrt(5)
    return int(round(fib_first))

fib_final = fib(100)

print(fib_final)

ref: Числа Фибоначчи в Python

1 голос
/ 21 сентября 2017

Использование функции добавления для генерации первых 100 элементов.

def generate():
    series = [0, 1]
    for i in range(0, 100):
        series.append(series[i] + series[i+1])

    return series


print(generate())
1 голос
/ 17 мая 2017

Это самый простой в python для ряда Фибоначчи, но он корректируется [0] в выходном массиве с помощью append (), чтобы получить вторую переменную списка результатов, равную result.append(second)

def fibo(num):
    first = 0
    second = 1
    result = [0]
    print('Fibonacci series is')
    for i in range(0,num):
        third = first + second
        #print(second)
        result.append(second)
        first = second
        second = third
    print(result)
    return
fibo(7)

OUTPUT

Fibonacci series is
[0, 1, 1, 2, 3, 5, 8, 13]
0 голосов
/ 02 сентября 2018

В гораздо более коротком формате:

def fibbo(range_, a, b):
    if(range_!=0):
        a, b = b, a+b
        print(a)
        return fibbo(range_-1, a, b)
    return

fibbo(11, 1, 0)
0 голосов
/ 24 октября 2011

15 минут в уроке, который я использовал при изучении Python, он попросил читателя написать программу, которая вычисляла бы последовательность Фибоначчи из 3-х входных чисел (первое число Фибоначчи, второе число и число, на котором нужно остановить последовательность). В учебнике были рассмотрены только переменные if / thens и циклы до этого момента. Функции пока нет. Я придумал следующий код:

sum = 0
endingnumber = 1                

print "\n.:Fibonacci sequence:.\n"

firstnumber = input("Enter the first number: ")
secondnumber = input("Enter the second number: ")
endingnumber = input("Enter the number to stop at: ")

if secondnumber < firstnumber:

    print "\nSecond number must be bigger than the first number!!!\n"

else:

while sum <= endingnumber:

    print firstnumber

    if secondnumber > endingnumber:

        break

    else:

        print secondnumber
        sum = firstnumber + secondnumber
        firstnumber = sum
        secondnumber = secondnumber + sum

Как видите, это действительно неэффективно, но работает.

0 голосов
/ 09 января 2018

Оптимизированная функция поиска Фибоначчи, сохраняя список в памяти

def fib(n, a=[0, 1]):
     while n > len(a):
         a.append(a[-1] + a[-2])
    return a[n-1]

print("Fibonacci of 50 - {}".format(fib(50))
0 голосов
/ 21 ноября 2017

Это похоже на то, что было опубликовано, но это чисто, быстро и легко читается.

def fib(n):
# start with first two fib numbers
fib_list = [0, 1]
i = 0
# Create loop to iterate through n numbers, assuming first two given
while i < n - 2:
    i += 1
    # append sum of last two numbers in list to list
    fib_list.append(fib_list[-2] + fib_list[-1])
return fib_list
0 голосов
/ 12 мая 2019

Ребята, пожалуйста, проверьте это, я думаю, что это удивительно и легко понять.

i = 0
First_Value = 0
Second_Value = 1

while(i < Number):
       if(i <= 1):
                  Next = i
       else:
                  Next = First_Value + Second_Value
                  First_Value = Second_Value
                  Second_Value = Next
       print(Next)
       i = i + 1
0 голосов
/ 17 января 2019

Простые Фибо:

def fibo(start, count):
    a = [start, start+1]
    for i in range(count-len(a)):
        a.append(a[-1]+a[-2])
    return a
a = fibo(0, 10)
print 'fibo', a

ВЫХОД: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

Фибоначчи, записанные в качестве генератора:

# fill in this function
def fib():
    a = 1
    b = 1
    yield(a)
    yield(b)
    for i in range(2, 10):
        c = a+b
        a, b = b, c
        yield(c)
    #pass #this is a null statement which does nothing when executed, useful as a placeholder.

# testing code
import types
if type(fib()) == types.GeneratorType:
    print("Good, The fib function is a generator.")

    counter = 0
    for n in fib():
        print(n)
        counter += 1
        if counter == 10:
            break
0 голосов
/ 24 ноября 2013
def fib(x, y, n):
    if n < 1: 
        return x, y, n
    else: 
        return fib(y, x + y, n - 1)

print fib(0, 1, 4)
(3, 5, 0)

#
def fib(x, y, n):
    if n > 1:
        for item in fib(y, x + y, n - 1):
            yield item
    yield x, y, n

f = fib(0, 1, 12)
f.next()
(89, 144, 1)
f.next()[0]
55
...