Początkowo błędnie zakodowałem program. Zamiast zwracać liczby Fibonacciego między zakresem (tj. StartNumber 1, endNumber 20 powinno = tylko te liczby między 1 a 20), napisałem, aby program wyświetlał wszystkie liczby Fibonacciego między zakresem (tj. StartNumber 1, endNumber 20 wyświetla = pierwsze 20 liczb Fibonacciego). Myślałem, że mam pewny kod. Nie rozumiem też, dlaczego tak się dzieje.
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))
Ktoś wskazał w mojej części II (która została zamknięta jako duplikat - /programming/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii ), że ja trzeba przekazać startNumber i endNumber przez generator przy użyciu pętli while. Czy ktoś może mi wskazać, jak to zrobić? Każda pomoc jest mile widziana.
Jestem programistą uczącym się i wpadłem w kłopoty. Jestem poproszony o napisanie programu, który będzie obliczał i wyświetlał Sekwencję Fibonacciego przez wprowadzony przez użytkownika numer początkowy i końcowy (tj. StartNumber = 20 endNumber = 100 i wyświetli tylko liczby z tego zakresu). Sztuczka polega na tym, aby używać go w sposób włączający (czego nie wiem, jak to zrobić w Pythonie? - zakładam, że oznacza to użycie zakresu włączającego?).
Jak dotąd nie mam faktycznego kodowania, ale raczej:
- Napisz wzór sekwencji Fib do nieskończoności
- Wyświetl startNumber do endNumber tylko z sekwencji Fib.
Nie mam pojęcia, od czego zacząć i proszę o pomysły lub wgląd w to, jak to napisać. Próbowałem też napisać forumla sekwencji Fib, ale też się na tym pogubiłem.
int(((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5)))
jakieś pomysły? @AndreaAmbun
jest powyżej 70 i wybucha,OverflowError
gdy kiedyn
jest nieco powyżej 600. Inne podejścia mogą obsłużyćn
1000 lub więcej bez dmuchania wzrost lub utrata precyzji.Wydajny Pythonic generator ciągu Fibonacciego
Znalazłem to pytanie, próbując uzyskać najkrótszą generację tej sekwencji w Pythonie (później zdałem sobie sprawę, że widziałem podobne w propozycji rozszerzenia Pythona ) i nie zauważyłem nikogo innego wymyślającego moje konkretne rozwiązanie (chociaż najlepsza odpowiedź zbliża się, ale jeszcze mniej elegancko), więc oto jest, z komentarzami opisującymi pierwszą iterację, bo myślę, że to może pomóc czytelnikom zrozumieć:
i zastosowanie:
wydruki:
(Dla celów atrybucji zauważyłem ostatnio podobną implementację w dokumentacji Pythona na temat modułów, nawet przy użyciu zmiennych
a
ib
, którą teraz pamiętam, widziałem przed napisaniem tej odpowiedzi. Ale myślę, że ta odpowiedź pokazuje lepsze użycie języka.)Implementacja definiowana rekurencyjnie
Online Encyclopedia of Integer sekwencji definiuje Fibonacciego rekurencyjnie jako
Zwięzłe zdefiniowanie tego rekurencyjnego w Pythonie można wykonać w następujący sposób:
Ale ta dokładna reprezentacja definicji matematycznej jest niewiarygodnie nieefektywna dla liczb znacznie większych niż 30, ponieważ każda obliczana liczba musi również obliczyć każdą liczbę poniżej niej. Możesz zademonstrować, jak powolne jest to, używając:
Zapamiętana rekursja dla wydajności
Można go zapamiętać w celu zwiększenia szybkości (w tym przykładzie wykorzystuje się fakt, że domyślny argument słowa kluczowego jest tym samym obiektem za każdym razem, gdy wywoływana jest funkcja, ale normalnie nie używałbyś zmiennego argumentu domyślnego z tego właśnie powodu):
Przekonasz się, że zapamiętana wersja jest znacznie szybsza i szybko przekroczy maksymalną głębokość rekursji, zanim będziesz mógł nawet pomyśleć o wstaniu na kawę. Możesz zobaczyć, o ile szybciej jest to wizualnie, robiąc to:
(Może się wydawać, że możemy po prostu wykonać poniższe czynności, ale w rzeczywistości nie pozwala nam to skorzystać z pamięci podręcznej, ponieważ wywołuje się przed wywołaniem setdefault).
Generator definiowany rekurencyjnie:
Kiedy uczyłem się Haskell, natknąłem się na tę implementację w Haskell:
Wydaje mi się, że najbliżej tego, co w tej chwili mogę uzyskać w Pythonie, jest:
To pokazuje:
Może jednak wzrosnąć tylko do limitu rekursji. Zwykle 1000, podczas gdy wersja Haskell może dochodzić do 100 milionów, chociaż wykorzystuje do tego całe 8 GB pamięci mojego laptopa:
Zużywanie iteratora w celu uzyskania n-tej liczby Fibonacciego
Komentator pyta:
Dokumentacja itertools zawiera przepis na to:
i teraz:
źródło
setdefault
wywołania jest oceniane przedsetdefault
jest.Dlaczego po prostu nie wykonać następujących czynności?
źródło
Idea sekwencji Fibonacciego jest pokazana w poniższym kodzie Pythona:
Oznacza to, że fib jest funkcją, która może wykonać jedną z trzech rzeczy. Definiuje fib (1) == 1, fib (0) == 0 i fib (n) jako:
fib (n-1) + fib (n-2)
Gdzie n jest dowolną liczbą całkowitą. Oznacza to, że na przykład fib (2) rozwija się do następującej arytmetyki:
Możemy obliczyć fib (3) w ten sam sposób za pomocą arytmetyki pokazanej poniżej:
Ważne jest, aby tutaj zdać sobie sprawę, że fib (3) nie można obliczyć bez obliczenia fib (2), które oblicza się znając definicje fib (1) i fib (0). Samo wywołanie funkcji, podobnie jak funkcja Fibonacciego, nazywa się rekurencją i jest to ważny temat w programowaniu.
To brzmi jak zadanie domowe, więc nie zamierzam robić dla ciebie części początkowej / końcowej. Python jest jednak do tego cudownie wyrazistym językiem, więc powinno to mieć sens, jeśli rozumiesz matematykę, i miejmy nadzieję, że nauczy Cię rekurencji. Powodzenia!
Edycja: Jedna potencjalna krytyka mojego kodu polega na tym, że nie używa on bardzo poręcznej wydajności funkcji Pythona, co sprawia, że funkcja fib (n) jest znacznie krótsza. Mój przykład jest jednak trochę bardziej ogólny, ponieważ niewiele języków poza Pythonem faktycznie daje wyniki.
źródło
Złożoność czasowa:
Funkcja buforowania ogranicza normalny sposób obliczania szeregów Fibonacciego z O (2 ^ n) do O (n) poprzez eliminację powtórzeń w drzewie rekurencyjnym szeregu Fibonacciego:
Kod :
źródło
Jest to dość wydajne przy użyciu O (log n) podstawowych operacji arytmetycznych.
Ten wykorzystuje podstawowe operacje arytmetyczne O (1), ale rozmiar wyników pośrednich jest duży, więc wcale nie jest wydajny.
To oblicza X ^ n w pierścieniu wielomianowym Z [X] / (X ^ 2 - X - 1) używając potęgowania przez podniesienie do kwadratu. Wynikiem tego obliczenia jest wielomian Fib (n) X + Fib (n-1), z którego można odczytać n-tą liczbę Fibonacciego.
Ponownie, wykorzystuje to O (log n) operacji arytmetycznych i jest bardzo wydajne.
źródło
n -= 1
działać poprawnie, ale też nie działan = 0
. W każdym razie naprawdę pomogłoby mi, gdyby dodano dużo kontekstu, aby wyjaśnić, jak to działa, zwłaszcza pierwsza technika. Widzę, że masz post na paulhankin.github.io/FibonacciKanoniczny kod Pythona do drukowania sekwencji Fibonacciego:
W przypadku problemu „Wydrukuj pierwszą liczbę Fibonacciego dłuższą niż 1000 cyfr”:
źródło
Wiemy to
I że n-ta potęga tej macierzy daje nam:
Możemy więc zaimplementować funkcję, która po prostu oblicza potęgę tej macierzy do potęgi n-tej -1.
jak wszystko, co wiemy, moc a ^ n jest równa
Więc na końcu funkcja Fibonacciego byłaby O (n) ... nic tak naprawdę nie różni się od łatwiejszej implementacji, gdyby nie fakt, że również o tym wiemy,
x^n * x^n = x^2n
a zatem oszacowaniex^n
można przeprowadzić ze złożonością O (log n )Oto moja implementacja Fibonacciego przy użyciu szybkiego języka programowania:
Ma to złożoność O (log n). Obliczamy moc Q z wykładnikiem n-1, a następnie bierzemy element m00, czyli Fn + 1, który przy wykładniku potęgi n-1 jest dokładnie n-tą liczbą Fibonacciego, którą chcieliśmy.
Gdy już masz szybką funkcję Fibonacciego, możesz iterować od numeru początkowego i końcowego, aby uzyskać interesującą Cię część ciągu Fibonacciego.
Oczywiście najpierw przeprowadź kontrolę na początku i na końcu, aby upewnić się, że mogą tworzyć prawidłowy zakres.
Wiem, że to pytanie ma 8 lat, ale i tak dobrze się bawiłem. :)
źródło
Ciąg Fibonacciego jest:
1, 1, 2, 3, 5, 8, ...
.Oznacza to
f(1) = 1
,f(2) = 1
,f(3) = 2
,...
,f(n) = f(n-1) + f(n-2)
.Moja ulubiona implementacja (najprostsza, a jednocześnie osiągająca prędkość światła w porównaniu z innymi implementacjami) to:
Test
wyczucie czasu
Edycja: przykładowa wizualizacja dla tych realizacji.
źródło
użyj rekurencji:
źródło
Inny sposób na zrobienie tego:
Przypisanie listy do „a”, przypisanie liczby całkowitej do „n” Map i redukuj to dwie z trzech najpotężniejszych funkcji w Pythonie. Tutaj mapa jest używana tylko do iteracji 'n-2' razy. a [-2:] otrzyma ostatnie dwa elementy tablicy. a.append (x + y) doda ostatnie dwa elementy i dołączy do tablicy
źródło
To wszystko wygląda na nieco bardziej skomplikowane, niż powinno. Mój kod jest bardzo prosty i szybki:
źródło
OK ... po zmęczeniu odwoływaniem się do wszystkich długich odpowiedzi, teraz znajdź poniższy sort & słodki, całkiem prosty sposób implementacji Fibonacciego w Pythonie. Możesz go ulepszyć tak, jak chcesz, uzyskując argument lub dane wejściowe użytkownika… lub zmienić limity z 10000. W razie potrzeby ……
To podejście również się sprawdza. Znajdź poniżej analizę uruchamiania
źródło
to jest ulepszenie odpowiedzi Mateusza Henry'ego:
kod powinien drukować b zamiast drukowania c
wyjście: 1,1,2,3,5 ....
źródło
Używając pętli for i wypisuj tylko wynik
Wynik
Wydrukuj
list
zawierający wszystkie liczbyWynik
źródło
Wyniki
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368 , 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 2524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433497874437, 70178734150, 70134736150 , 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 40527395805378708705376, 27876208701
czas pracy: 0,04298138618469238
źródło
jest na to bardzo prosty sposób!
możesz uruchomić ten kod bezpłatnie online, korzystając z http://www.learnpython.org/
źródło
Można to zrobić w następujący sposób.
źródło
Dla zabawy, w Pythonie 3.8+ możesz użyć wyrażenia przypisania (znanego również jako operator morsa) w zrozumieniu listowym , np .:
Wyrażenie przypisania umożliwia przypisanie wartości do zmiennej i zwrócenie jej w tym samym wyrażeniu. Dlatego wyrażenie
jest równoważne wykonaniu
i zwracając wartość
b
.źródło
Po 15 minutach samouczka, którego użyłem podczas nauki języka Python, poprosiłem czytelnika o napisanie programu, który obliczy ciąg Fibonacciego z 3 liczb wejściowych (pierwsza liczba Fibonacciego, druga liczba i liczba, przy której zatrzyma sekwencję). Samouczek obejmował tylko zmienne, jeśli / to i pętle do tego momentu. Nie ma jeszcze funkcji. Wymyśliłem następujący kod:
Jak widać, jest to naprawdę nieefektywne, ale DZIAŁA.
źródło
źródło
eval(input())
nie jest tu potrzebny; Myślę, żeint(input())
w przypadku jest lepiej.Właśnie przechodząc przez http://projecteuler.net/problem=2 to było moje podejście
źródło
źródło
Może to pomoże
źródło
oparty na klasycznej sekwencji Fibonacciego i tylko ze względu na jednowierszowe
jeśli potrzebujesz tylko numeru indeksu, możesz użyć redukcji (nawet jeśli zmniejszasz, to nie nadaje się do tego najlepiej, może to być dobre ćwiczenie)
aby uzyskać pełną tablicę, po prostu usuń or (r.pop (0) i 0)
źródło
A co z tym? Wydaje mi się, że nie jest tak wyszukany, jak inne sugestie, ponieważ wymaga wstępnej specyfikacji poprzedniego wyniku, aby uzyskać oczekiwany wynik, ale uważam, że jest to bardzo czytelna opcja, tj. Wszystko, co robi, to podanie wyniku i poprzedniego wyniku do rekurencja.
Oto wynik:
źródło
Zasadniczo przetłumaczone z Rubiego:
...
źródło
źródło
Bardziej szczegółowe wyjaśnienie, jak działa memoizacja dla sekwencji Fibonacciego.
źródło
Próbowałem uniknąć funkcji rekurencyjnej, aby rozwiązać ten problem, więc przyjąłem podejście iteracyjne. Początkowo wykonywałem zapamiętaną funkcję rekurencyjną, ale nadal osiągałem maksymalną głębokość rekurencyjną. Miałem również ścisłe cele dotyczące pamięci, więc zobaczysz, jak utrzymuję tablicę tak małą, jak tylko potrafię podczas procesu zapętlania, utrzymując w tablicy tylko 2-3 wartości w dowolnym momencie.
Uzyskanie 6-milionowej liczby Fibonacciego zajmuje około 282 sekund na moim komputerze, podczas gdy 600k Fibonacciego zajmuje tylko 2,8 sekundy. Nie udało mi się uzyskać tak dużych liczb Fibonacciego z funkcją rekurencyjną, nawet zapamiętaną.
źródło