Είχα αρχικά κωδικοποιήσει το πρόγραμμα λανθασμένα. Αντί να επιστρέφει τους αριθμούς Fibonacci μεταξύ ενός εύρους (δηλ. startNumber 1, endNumber 20 θα πρέπει να = μόνο οι αριθμοί μεταξύ 1 & 20), έχω γράψει για το πρόγραμμα να εμφανίζει όλους τους αριθμούς Fibonacci μεταξύ ενός εύρους (δηλ. startNumber 1, endNumber 20 εμφανίζει = Πρώτα 20 αριθμούς Fibonacci). Νόμιζα ότι είχα έναν σίγουρο κώδικα. Επίσης, δεν καταλαβαίνω γιατί συμβαίνει αυτό.
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))
Κάποιος επισήμανε στο Μέρος ΙΙ μου (το οποίο έκλεισε επειδή ήταν διπλότυπο - https://stackoverflow.com/questions/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii) ότι πρέπει να περάσω τον αριθμό αρχής και τον αριθμό τέλους μέσω μιας γεννήτριας χρησιμοποιώντας έναν βρόχο while. Μπορεί κάποιος να μου υποδείξει την κατεύθυνση για το πώς να το κάνω αυτό; Οποιαδήποτε βοήθεια είναι ευπρόσδεκτη.
Είμαι ένας μαθητευόμενος προγραμματιστής και έχω πέσει σε ένα μικρό αλαλούμ. Μου ζητείται να γράψω ένα πρόγραμμα που θα υπολογίζει και θα εμφανίζει την ακολουθία Fibonacci's Sequence από έναν αριθμό αρχής και έναν αριθμό τέλους που εισάγει ο χρήστης (π.χ. startNumber = 20 endNumber = 100 και θα εμφανίζει μόνο τους αριθμούς μεταξύ αυτού του εύρους). Το τέχνασμα είναι να το χρησιμοποιήσετε συμπεριληπτικά (το οποίο δεν ξέρω πώς να το κάνω στην Python; - Υποθέτω ότι αυτό σημαίνει ότι πρέπει να χρησιμοποιήσω μια περιοχή χωρίς αποκλεισμούς;).
Αυτό που έχω μέχρι στιγμής δεν είναι πραγματική κωδικοποίηση αλλά μάλλον:
Δεν έχω ιδέα από πού να ξεκινήσω και ζητώ ιδέες ή διορατικότητα για το πώς να το γράψω αυτό. Έχω επίσης προσπαθήσει να γράψω το forumla ακολουθίας Fib αλλά χάνω και σε αυτό.
Υπάρχουν πολλές πληροφορίες σχετικά με την ακολουθία Fibonacci στη wikipedia και στη wolfram. Πολύ περισσότερες από όσες μπορεί να χρειαστείτε. Όπως και να έχει, είναι καλό να μάθετε πώς να χρησιμοποιείτε αυτές τις πηγές για να βρείτε (γρήγορα αν είναι δυνατόν) αυτό που χρειάζεστε.
Στα μαθηματικά, δίνεται σε αναδρομική μορφή:
Στον προγραμματισμό, το άπειρο δεν υπάρχει. Μπορείτε να χρησιμοποιήσετε μια αναδρομική μορφή μεταφράζοντας τη μαθηματική μορφή απευθείας στη γλώσσα σας, για παράδειγμα στην Python γίνεται:
def F(n):
if n == 0: return 0
elif n == 1: return 1
else: return F(n-1)+F(n-2)
Δοκιμάστε το στην αγαπημένη σας γλώσσα και δείτε ότι αυτή η μορφή απαιτεί πολύ χρόνο καθώς το n μεγαλώνει. Στην πραγματικότητα, αυτό είναι O(2n) σε χρόνο.
Πηγαίνετε στις ιστοσελίδες που σας παρέπεμψα και θα το δείτε αυτό (στο wolfram):
Αυτή είναι αρκετά εύκολη στην υλοποίηση και πολύ, πολύ γρήγορη στον υπολογισμό της, σε Python:
from math import sqrt
def F(n):
return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))
Ένας άλλος τρόπος για να το κάνετε είναι να ακολουθήσετε τον ορισμό (από τη wikipedia):
Ο πρώτος αριθμός της ακολουθίας είναι το 0, Ο δεύτερος αριθμός είναι 1, και κάθε επόμενος αριθμός είναι ίσος με το άθροισμα των δύο προηγούμενων αριθμών της ακολουθίας. της ίδιας της ακολουθίας, δίνοντας την ακολουθία 0, 1, 1, 1, 2, 3, 5, 8, κ.λπ.
Εάν η γλώσσα σας υποστηρίζει επαναλήπτες, μπορείτε να κάνετε κάτι τέτοιο:
def F():
a,b = 0,1
while True:
yield a
a, b = b, a + b
Μόλις μάθετε πώς να δημιουργείτε αριθμούς Fibonacci, πρέπει απλώς να κάνετε έναν κύκλο στους αριθμούς και να ελέγξετε αν επαληθεύουν τις δεδομένες συνθήκες.
Ας υποθέσουμε τώρα ότι γράψατε μια f(n) που επιστρέφει τον n-οστό όρο της ακολουθίας Fibonacci (όπως αυτή με το sqrt(5) )
Στις περισσότερες γλώσσες μπορείτε να κάνετε κάτι τέτοιο:
def SubFib(startNumber, endNumber):
n = 0
cur = f(n)
while cur <= endNumber:
if startNumber <= cur:
print cur
n += 1
cur = f(n)
Στην python θα χρησιμοποιούσα τη μορφή του επαναλήπτη και θα πήγαινα για:
def SubFib(startNumber, endNumber):
for cur in F():
if cur > endNumber: return
if cur >= startNumber:
yield cur
for i in SubFib(10, 200):
print i
Η συμβουλή μου είναι να μάθεις να διαβάζεις αυτό που χρειάζεσαι. Το Project Euler (google for it) θα σε εκπαιδεύσει να το κάνεις :P Καλή τύχη και καλή διασκέδαση!
Η ιδέα πίσω από την ακολουθία Fibonacci παρουσιάζεται στον ακόλουθο κώδικα Python:
def fib(n):
if n == 1:
return 1
elif n == 0:
return 0
else:
return fib(n-1) + fib(n-2)
Αυτό σημαίνει ότι η fib είναι μια συνάρτηση που μπορεί να κάνει ένα από τα τρία πράγματα. Ορίζει ότι η fib(1) == 1, η fib(0) == 0 και η fib(n) να είναι:
fib(n-1) + fib(n-2)
Όπου n είναι ένας αυθαίρετος ακέραιος αριθμός. Αυτό σημαίνει ότι η fib(2), για παράδειγμα, επεκτείνεται στην ακόλουθη αριθμητική:
fib(2) = fib(1) + fib(0)
fib(1) = 1
fib(0) = 0
# Therefore by substitution:
fib(2) = 1 + 0
fib(2) = 1
Μπορούμε να υπολογίσουμε την fib(3) με τον ίδιο τρόπο με την αριθμητική που φαίνεται παρακάτω:
fib(3) = fib(2) + fib(1)
fib(2) = fib(1) + fib(0)
fib(2) = 1
fib(1) = 1
fib(0) = 0
# Therefore by substitution:
fib(3) = 1 + 1 + 0
Το σημαντικό πράγμα που πρέπει να συνειδητοποιήσουμε εδώ είναι ότι η fib(3) δεν μπορεί να υπολογιστεί χωρίς τον υπολογισμό της fib(2), η οποία υπολογίζεται γνωρίζοντας τους ορισμούς της fib(1) και της fib(0). Το να καλεί μια συνάρτηση τον εαυτό της όπως κάνει η συνάρτηση fibonacci ονομάζεται αναδρομή και είναι ένα σημαντικό θέμα στον προγραμματισμό.
Αυτό ακούγεται σαν εργασία για το σπίτι, οπότε δεν πρόκειται να κάνω το κομμάτι της αρχής/τέλους για εσάς. Η Python είναι μια θαυμάσια εκφραστική γλώσσα για αυτό όμως, οπότε αυτό θα πρέπει να βγάλει νόημα αν καταλαβαίνετε μαθηματικά, και ελπίζω ότι θα σας διδάξει για την αναδρομή. Καλή τύχη!
Επεξεργασία: Μια πιθανή κριτική στον κώδικά μου είναι ότι δεν χρησιμοποιεί την εξαιρετικά εύχρηστη συνάρτηση yield της Python, η οποία κάνει τη συνάρτηση fib(n) πολύ πιο σύντομη. Το παράδειγμά μου όμως είναι λίγο πιο γενικό, αφού δεν υπάρχουν πολλές γλώσσες εκτός της Python που να έχουν yield.
def fib():
a,b = 1,1
num=eval(input("Please input what Fib number you want to be calculated: "))
num_int=int(num-2)
for i in range (num_int):
a,b=b,a+b
print(b)