סדרת פיבונאצ'י בג'אווה

1. סקירה כללית

במדריך זה נבחן את סדרת פיבונאצ'י.

באופן ספציפי, נבצע שלוש דרכים לחישוב ה- נ ' המונח של סדרת פיבונאצ'י, האחרון הוא פיתרון לזמן קבוע.

2. סדרת פיבונאצ'י

סדרת פיבונאצ'י היא סדרת מספרים שבה כל מונח הוא סכום שני המונחים הקודמים. זה שתי הקדנציות הראשונות 0 ו 1.

לדוגמה, 11 המונחים הראשונים של הסדרה הם 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ו 55.

במונחים מתמטיים, הרצף סנ ממספרי פיבונאצ'י מוגדר על ידי יחס ההישנות:

S (n) = S (n-1) + S (n-2), עם S (0) = 0 ו- S (1) = 1

עכשיו, בואו נסתכל כיצד לחשב את נ ' תקופת סדרת פיבונאצ'י. שלוש השיטות בהן נתמקד הן רקורסיביות, איטרטיביות ומשתמשות בנוסחה של Binet.

2.1. שיטה רקורסיבית

לפיתרון הראשון שלנו, בואו ונביע את יחס ההישנות ישירות ב- Java:

intic public stat nthFibonacciTerm (int n) {if (n == 1 || n == 0) {return n; } להחזיר nthFibonacciTerm (n-1) + nthFibonacciTerm (n-2); }

כפי שאנו רואים, אנו בודקים האם נ שווה ל 0 אוֹ 1. אם זה נכון, אנו מחזירים ערך זה. בכל מקרה אחר, אנו קוראים רקורסיבית לפונקציה לחישוב ה- (n-1) טווח ו (n-2) טווח והחזרת סכומם.

למרות שהשיטה הרקורסיבית פשוטה ליישום, אנו רואים ששיטה זו עושה חישובים חוזרים רבים. למשל, על מנת לחשב את 6 מונח, אנו מתקשרים לחישוב ה- 5 וה 4 טווח. יתר על כן, הקריאה לחשב את 5 מונח מתקשר לחישוב ה- 4 קדנציה שוב. בגלל עובדה זו, השיטה הרקורסיבית עושה עבודה מיותרת רבה.

כפי שמתברר, זה עושה מורכבות הזמן מעריכית שלה; O (Φn) לדייק.

2.2. שיטה איטרטיבית

בשיטה האיטרטיבית אנו יכולים להימנע מחישובים חוזרים שנעשים בשיטה הרקורסיבית. במקום זאת אנו מחשבים את תנאי הסדרה ומאחסנים את שני המונחים הקודמים כדי לחשב את הבא.

בואו נסתכל על יישומה:

intic public stat nthFibonacciTerm (int n) {if (n == 0 || n == 1) {return n; } int n0 = 0, n1 = 1; int tempNthTerm; עבור (int i = 2; i <= n; i ++) {tempNthTerm = n0 + n1; n0 = n1; n1 = tempNthTerm; } להחזיר n1; }

ראשית, אנו בודקים האם המונח שיש לחשב הוא ה- 0 מונח או 1 טווח. אם זה המקרה, אנו מחזירים את הערכים הראשוניים. אחרת, אנו מחשבים את 2 מונח באמצעות n0 ו n1. לאחר מכן אנו משנים את הערכים של n0 ו n1 משתנים לאחסון 1 טווח ו 2 מונח בהתאמה. אנו ממשיכים לאתר עד שחישבנו את המונח הנדרש.

השיטה האיטרטיבית נמנעת מעבודה חוזרת על ידי שמירת שני מונחי פיבונאצ'י האחרונים במשתנים. מורכבות הזמן ומורכבות החלל של השיטה האיטרטיבית היא עַל) ו O (1) בהתאמה.

2.3. הנוסחה של בינת

הגדרנו רק את נ ' מספר פיבונאצ'י במונחים של השניים שלפניו. כעת, נסתכל על הנוסחה של Binet לחישוב ה- נ ' מספר פיבונאצ'י בזמן קבוע.

מונחי פיבונאצ'י שומרים על יחס שנקרא יחס הזהב מסומן על ידי Φ, הדמות היוונית מבוטאת 'פי'.

ראשית, בואו נסתכל כיצד ה יחס הזהב מחושב:

Φ = (1 + √5) / 2 = 1.6180339887 ...

עכשיו, בואו נסתכל על הנוסחה של בינט:

Sn = Φⁿ - (- Φ⁻ⁿ) / √5

למעשה, זה אומר את זה אנחנו צריכים להיות מסוגלים להשיג את נ ' מספר פיבונאצ'י עם רק חשבון.

בואו נביע זאת ב- Java:

intic public st nthFibonacciTerm (int n) {square squareRootOf5 = Math.sqrt (5); כפול phi = (1 + squareRootOf5) / 2; int nthTerm = (int) ((Math.pow (phi, n) - Math.pow (-phi, -n)) / squareRootOf5); להחזיר nthTerm; }

תחילה אנו מחשבים את מרובע Rootof5 ו פי ולאחסן אותם במשתנים. מאוחר יותר, אנו מיישמים את הנוסחה של Binet כדי לקבל את המונח הנדרש.

מכיוון שאנחנו עוסקים כאן במספרים לא רציונליים, נקבל קירוב בלבד. כתוצאה מכך, נצטרך להחזיק במקומות עשרוניים רבים יותר עבור מספרים גבוהים יותר של פיבונאצ'י כדי להסביר את שגיאת העגול.

אנו רואים כי השיטה הנ"ל מחשבת את ה- נ ' מונח פיבונאצ'י בזמן קבוע, או O (1).

3. מסקנה

במאמר קצר זה, הסתכלנו על סדרת פיבונאצ'י. הסתכלנו על פיתרון רקורסיבי ואיטרטיבי. לאחר מכן, יישמנו את הנוסחה של בינט כדי ליצור פתרון בזמן קבוע.

כמו תמיד, קוד המקור המלא של דוגמאות העבודה זמין באתר GitHub.