Saya awalnya salah kode program. Alih-alih mengembalikan angka Fibonacci antara rentang (mis. StartNumber 1, endNumber 20 seharusnya = hanya angka-angka di antara 1 & 20), saya telah menulis untuk program ini untuk menampilkan semua angka Fibonacci antara rentang (mis. StartNumber 1, endNumber 20 display = 20 angka Fibonacci Pertama). Saya pikir saya punya kode pasti. Saya juga tidak mengerti mengapa ini terjadi.
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))
Seseorang menunjukkan dalam Bagian II saya (yang ditutup karena duplikat - /programming/504193/how-to-write-the-fibonacci- berikutnyaence- in-python-part-ii ) bahwa saya harus melewati startNumber dan endNumber melalui generator menggunakan loop sementara. Dapatkah seseorang tolong tunjukkan saya arah bagaimana melakukan ini? Setiap bantuan dipersilahkan.
Saya seorang programmer belajar dan saya telah mengalami sedikit campur aduk. Saya diminta untuk menulis sebuah program yang akan menghitung dan menampilkan Urutan Fibonacci oleh pengguna memasukkan angka awal dan angka akhir (mis. StartNumber = 20 endNumber = 100 dan hanya akan menampilkan angka-angka di antara rentang itu). Triknya adalah menggunakannya secara inklusif (yang saya tidak tahu bagaimana melakukannya dengan Python? - Saya berasumsi ini berarti menggunakan rentang inklusif?).
Apa yang saya miliki sejauh ini bukan coding sebenarnya melainkan:
- Tulis rumus urutan Fib hingga tak terbatas
- Tampilan startNumber hingga endNumber hanya dari urutan Fib.
Saya tidak tahu harus mulai dari mana dan saya meminta ide atau wawasan tentang cara menulis ini. Saya juga telah mencoba untuk menulis urutan forum Fib tapi saya tersesat juga.
int(((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5)))
, ada ide? @AndreaAmbun
atas 70 dan meledak denganOverflowError
ketikan
sedikit di atas 600. Pendekatan lain dapat menanganin
1000 atau lebih tanpa meniup atau kehilangan presisi.Generator Pythonic yang efisien dari deret Fibonacci
Saya menemukan pertanyaan ini ketika mencoba untuk mendapatkan generasi Pythonic terpendek dari urutan ini (kemudian menyadari bahwa saya telah melihat yang serupa dalam Proposal Peningkatan Python ), dan saya belum melihat ada orang lain yang datang dengan solusi spesifik saya (walaupun jawaban teratas semakin dekat, tetapi masih kurang elegan), jadi ini dia, dengan komentar yang menggambarkan iterasi pertama, karena saya pikir itu dapat membantu pembaca memahami:
dan penggunaan:
cetakan:
(Untuk tujuan atribusi, saya baru-baru ini memperhatikan implementasi yang serupa dalam dokumentasi Python pada modul, bahkan menggunakan variabel
a
danb
, yang sekarang saya ingat pernah melihat sebelum menulis jawaban ini. Tapi saya pikir jawaban ini menunjukkan penggunaan bahasa yang lebih baik.)Implementasi yang didefinisikan secara rekursif
The online Encyclopedia of Integer Urutan mendefinisikan Fibonacci Sequence rekursif sebagai
Mendefinisikan secara ringkas ini secara Python dapat dilakukan sebagai berikut:
Tetapi representasi pasti dari definisi matematika ini sangat tidak efisien untuk angka-angka yang jauh lebih besar dari 30, karena setiap angka yang dihitung juga harus menghitung untuk setiap angka di bawahnya. Anda dapat menunjukkan seberapa lambatnya dengan menggunakan yang berikut:
Rekursi memo untuk efisiensi
Ini dapat di-memoise untuk meningkatkan kecepatan (contoh ini mengambil keuntungan dari fakta bahwa argumen kata kunci default adalah objek yang sama setiap kali fungsi dipanggil, tetapi biasanya Anda tidak akan menggunakan argumen default yang bisa berubah-ubah untuk alasan ini):
Anda akan menemukan versi memoized jauh lebih cepat, dan akan dengan cepat melebihi kedalaman rekursi maksimum Anda bahkan sebelum Anda berpikir untuk bangun untuk minum kopi. Anda dapat melihat seberapa cepat secara visual dengan melakukan ini:
(Sepertinya kita bisa melakukan yang di bawah ini, tetapi sebenarnya tidak membiarkan kita mengambil keuntungan dari cache, karena ia memanggil dirinya sendiri sebelum setdefault dipanggil.)
Generator yang didefinisikan secara rekursif:
Karena saya telah belajar Haskell, saya menemukan implementasi ini di Haskell:
Yang paling dekat saya pikir bisa saya dapatkan dengan Python saat ini adalah:
Ini menunjukkannya:
Namun, itu hanya bisa mencapai batas rekursi. Biasanya, 1000, sedangkan versi Haskell dapat mencapai 100-an juta, meskipun menggunakan semua 8 GB memori laptop saya untuk melakukannya:
Mengkonsumsi iterator untuk mendapatkan nomor fibonacci ke-n
Seorang komentator bertanya:
Dokumentasi itertools memiliki resep untuk ini:
dan sekarang:
sumber
setdefault
panggilan dievaluasi sebelumnyasetdefault
.Mengapa tidak sekadar melakukan yang berikut?
sumber
Gagasan di balik deret Fibonacci ditunjukkan dalam kode Python berikut:
Ini berarti bahwa fib adalah fungsi yang dapat melakukan satu dari tiga hal. Ini mendefinisikan fib (1) == 1, fib (0) == 0, dan fib (n) menjadi:
fib (n-1) + fib (n-2)
Di mana n adalah integer yang berubah-ubah. Ini berarti bahwa fib (2) misalnya, memperluas ke aritmatika berikut:
Kita dapat menghitung fib (3) dengan cara yang sama dengan aritmatika yang ditunjukkan di bawah ini:
Yang penting untuk disadari di sini adalah bahwa fib (3) tidak dapat dihitung tanpa menghitung fib (2), yang dihitung dengan mengetahui definisi dari fib (1) dan fib (0). Memiliki panggilan fungsi itu sendiri seperti fungsi fibonacci tidak disebut rekursi, dan ini merupakan topik penting dalam pemrograman.
Ini terdengar seperti tugas pekerjaan rumah jadi saya tidak akan melakukan bagian awal / akhir untuk Anda. Python adalah bahasa yang sangat ekspresif untuk ini, jadi ini masuk akal jika Anda memahami matematika, dan mudah-mudahan akan mengajarkan Anda tentang rekursi. Semoga berhasil!
Sunting: Salah satu kritik potensial terhadap kode saya adalah bahwa ia tidak menggunakan fungsi Python yang sangat berguna, yang membuat fungsi fib (n) jauh lebih pendek. Contoh saya sedikit lebih umum, karena tidak banyak bahasa di luar Python yang benar-benar menghasilkan.
sumber
Kompleksitas waktu:
Fitur caching mengurangi cara normal menghitung seri Fibonacci dari O (2 ^ n) menjadi O (n) dengan menghilangkan pengulangan di pohon rekursif seri Fibonacci:
Kode:
sumber
Ini cukup efisien, menggunakan operasi aritmatika dasar O (log n).
Yang ini menggunakan O (1) operasi aritmatika dasar, tetapi ukuran hasil antara besar dan sama sekali tidak efisien.
Yang ini menghitung X ^ n dalam cincin polinomial Z [X] / (X ^ 2 - X - 1) menggunakan eksponensial dengan mengkuadratkan. Hasil perhitungan itu adalah Fib polinomial (n) X + Fib (n-1), dari mana angka Fibonacci n dapat dibaca.
Sekali lagi, ini menggunakan operasi hitung O (log n) dan sangat efisien.
sumber
n -= 1
bekerja dengan benar, dan itu juga tidak bekerja dengann = 0
. Bagaimanapun, itu akan sangat membantu saya jika banyak konteks ditambahkan untuk menjelaskan bagaimana ini bekerja, terutama teknik pertama. Saya melihat Anda memiliki pos di paulhankin.github.io/FibonacciKode Python Canonical untuk mencetak urutan Fibonacci:
Untuk masalah "Cetak angka Fibonacci pertama yang lebih besar dari 1000 digit":
sumber
Kami tahu itu
Dan bahwa kekuatan ke-n dari matriks itu memberi kita:
Jadi kita bisa mengimplementasikan fungsi yang hanya menghitung kekuatan matriks itu ke kekuatan n-th -1.
karena yang kita tahu kekuatan a sama dengan
Jadi pada akhirnya fungsi fibonacci akan menjadi O (n) ... tidak ada yang benar-benar berbeda dari implementasi yang lebih mudah jika bukan karena fakta bahwa kita juga tahu itu
x^n * x^n = x^2n
dan evaluasix^n
karenanya dapat dilakukan dengan kompleksitas O (log n )Berikut ini adalah implementasi fibonacci saya menggunakan bahasa pemrograman cepat:
Ini memiliki kompleksitas O (log n). Kami menghitung kekuatan Q dengan eksponen n-1 dan kemudian kami mengambil elemen m00 yaitu Fn + 1 yang pada eksponen daya n-1 persis angka Fibonacci ke-n yang kami inginkan.
Setelah Anda memiliki fungsi fibonacci cepat, Anda dapat beralih dari nomor awal dan nomor akhir untuk mendapatkan bagian dari deret Fibonacci yang Anda minati.
tentu saja pertama kali melakukan beberapa pemeriksaan pada awal dan akhir untuk memastikan mereka dapat membentuk rentang yang valid.
Saya tahu pertanyaannya adalah 8 tahun, tetapi saya tetap senang menjawab. :)
sumber
Fibonacci urutan:
1, 1, 2, 3, 5, 8, ...
.Artinya
f(1) = 1
,f(2) = 1
,f(3) = 2
,...
,f(n) = f(n-1) + f(n-2)
.Implementasi favorit saya (paling sederhana namun mencapai kecepatan rendah dibandingkan dengan implementasi lainnya) adalah ini:
Uji
Pengaturan waktu
Edit: contoh visualisasi untuk implementasi ini.
sumber
gunakan rekursi:
sumber
Cara lain untuk melakukannya:
Menetapkan daftar ke 'a', menetapkan integer ke 'n' Map dan mengurangi adalah 2 dari tiga fungsi paling kuat dalam python. Di sini peta digunakan hanya untuk mengulangi 'n-2' kali. a [-2:] akan mendapatkan dua elemen terakhir dari sebuah array. a.append (x + y) akan menambahkan dua elemen terakhir dan akan menambahkan ke array
sumber
Ini semua terlihat sedikit lebih rumit dari yang seharusnya. Kode saya sangat sederhana dan cepat:
sumber
Oke .. setelah bosan merujuk semua jawaban yang panjang, sekarang temukan cara di bawah ini & manis, cara yang sangat mudah untuk menerapkan Fibonacci dalam python. Anda dapat meningkatkannya dengan cara yang Anda inginkan dengan mendapatkan argumen atau mendapatkan input pengguna ... atau mengubah batas dari 10000. Seperti yang Anda butuhkan ……
Pendekatan ini juga berkinerja baik. Temukan analitik yang dijalankan di bawah ini
sumber
ini merupakan peningkatan untuk jawaban hewry:
kode harus dicetak b bukan cetak c
output: 1,1,2,3,5 ....
sumber
Menggunakan untuk loop dan mencetak hasilnya saja
Hasil
Cetak yang
list
berisi semua angkaHasil
sumber
Hasil
[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 ,,,,,,,,,,,,,,,,,,,,,,,,,, ,_7121_112112190112112121212,1212,1212,123127 besar, peningkatan daya,,,,,,,,,,,,, peningkatan,,,,,,,,,,,,,, Pen lanjut, Pen. , 12586269025, 20361.0121.0121.312.161.161.161.161.161.161 .112.161 daya.25, saat ini adalah anggota baru:
jangka waktu: 0,04298138618469238
sumber
ada metode yang sangat mudah untuk disadari!
Anda dapat menjalankan kode ini secara online secara bebas dengan menggunakan http://www.learnpython.org/
sumber
Itu bisa dilakukan dengan cara berikut.
sumber
Hanya untuk bersenang-senang, dalam Python 3.8+ Anda dapat menggunakan ekspresi penugasan (alias operator walrus) dalam pemahaman daftar, misalnya:
Ekspresi penugasan memungkinkan Anda untuk menetapkan nilai ke variabel dan mengembalikannya dalam ekspresi yang sama. Karena itu, ungkapan
setara dengan mengeksekusi
dan mengembalikan nilai
b
.sumber
15 menit tutorial yang saya gunakan ketika belajar Python, ia meminta pembaca untuk menulis sebuah program yang akan menghitung urutan Fibonacci dari 3 angka input (angka Fibonacci pertama, angka kedua, dan angka untuk menghentikan urutan). Tutorial hanya membahas variabel, jika / kemudian, dan loop sampai ke titik itu. Belum ada fungsi. Saya datang dengan kode berikut:
Seperti yang Anda lihat, ini benar-benar tidak efisien, tetapi TIDAK BAIK.
sumber
sumber
eval(input())
tidak diperlukan di sini; Saya pikirint(input())
dalam kasus ini lebih baik.Hanya melalui http://projecteuler.net/problem=2 ini adalah pendapat saya
sumber
sumber
Mungkin ini akan membantu
sumber
berdasarkan urutan fibonacci klasik dan hanya demi satu-liners
jika Anda hanya membutuhkan jumlah indeks, Anda dapat menggunakan pengurangan (bahkan jika pengurangan itu tidak cocok untuk ini, ini bisa menjadi latihan yang baik)
dan untuk mendapatkan array lengkap cukup hapus atau (r.pop (0) dan 0)
sumber
Bagaimana dengan yang ini? Saya kira itu tidak semewah saran lainnya karena menuntut spesifikasi awal dari hasil sebelumnya untuk menghasilkan output yang diharapkan, tetapi saya merasa adalah pilihan yang sangat mudah dibaca, yaitu, semua yang dilakukannya adalah memberikan hasil dan hasil sebelumnya untuk rekursi.
Inilah hasilnya:
sumber
Diterjemahkan pada dasarnya dari Ruby:
...
sumber
sumber
Penjelasan lebih rinci tentang cara Memoisasi bekerja untuk urutan Fibonacci.
sumber
Saya mencoba menghindari fungsi rekursif untuk menyelesaikan masalah ini, jadi saya mengambil pendekatan berulang. Saya awalnya melakukan fungsi rekursif memoised tetapi terus memukul kedalaman rekursif max. Saya juga memiliki tujuan memori yang ketat sehingga Anda akan melihat saya menjaga array sekecil yang saya bisa selama proses perulangan hanya menjaga 2-3 nilai dalam array setiap saat.
Mendapatkan 6 juta nomor fibonacci membutuhkan sekitar 282 detik di mesin saya sedangkan 600k fibonacci hanya membutuhkan 2,8 detik. Saya tidak dapat memperoleh angka fibonacci sebesar itu dengan fungsi rekursif, bahkan nomor memo.
sumber