פורסם: 02/11/2017 - 11:47
נושא ההודעה: סדרת פיבונאצ'י ב- haskell. מתקשה להבין. עצבני אש.
|
זה קוד שמייצר סדרת פיבונאצ'י אינסופית:
קוד: | fib = 1 : 1 : [a + b | (a, b) <- zip fib (tail fib)] |
1. fib נמצא משמאל לסימן השווה ועל כן הוא מחכה להיות מחושב ע"י הקוד שמצד ימין של סימן השווה.
אז איך אפשר להשתמש ב- fib בתוך הצד הימני כאשר הוא עדיין לא חוּשָב?
2. כמובן שאני טועה ב1, אבל בשביל השאלה הזו אני מדלג על זה שאני לא מבין את 1 ומקבל את גזר הדין.
אני מקשר לstackoverflow שבו מישהו נתן תשובה שהכי מתקרבת להבנה שלי ושם קל לי להראות מה אני לא מבין כי הוא כבר עשה בשבילי את העבודה:
https://stackoverflow.com/a/42183415/246387
אני מדבר על המעבר מהשורה הזו:
קוד: | = 0 : 1 : 1 : [ a + b | (a, b) <- zip [1, ??] [??]] |
אל השורה הזו:
קוד: | = 0 : 1 : 1 : [ a + b | (a, b) <- zip [1, 1, ??] [1, ??]] |
אם מישהו יוכל להסביר לי את זה, מאוד אשמח.
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 14:04
נושא ההודעה:
|
לא מכיר מספיק הסקל, אבל אני מניח שהוא מחשב רק את מה שהוא צריך
כלומר - ב"שלב הראשון" אתה סוכם את האיבר הראשון והשני - הם כבר קיימים - והתוצאה היא האיבר השלישי. האיבר השלישי נדרש רק כשמישהו "מבקש" את הרביעי, אז השלישי כבר קיים ב-fib (בכל שלושת ההתיחסויות אליו)
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 16:27
נושא ההודעה:
|
תודה לך אבל אני עדיין מתקשה.
בוא נלך איתך.
אכן נניח שיש לנו את האיבר השלישי כלומר כרגע הרשימה שלנו תהיה כך:
קוד: | 1 : 1 : 2 : [a + b | (a, b) <- zip fib (tail fib) ] |
כי סכמנו את שני הראשונים וקיבלנו את האיבר השלישי וחיברנו אותו להמשך הרשימה אחרי 1 : 1
אבל איך מפה אני מגיע לאיבר הרביעי שהוא הספרה 3?
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 16:28
נושא ההודעה:
|
או יותר במדוייק מהו fib עכשיו ומהו tail fib עכשיו?
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 16:46
נושא ההודעה:
|
fib הוא תמיד כל הסדרה, ו-tail fib הוא תמיד כל הסדרה פרט לאיבר הראשון.
כמובן, זאת בעצמה ההגדרה של הסדרה fib
איך שאני חושב על זה זה שיש לך רק פעם אחת את הרשימה, ואתה שומר שני "מצביעים" למקומות בהם אתה מסתכל
כל פעם אתה מקדם את שניהם, ביחד עם המקום שבו אתה מחשב כרגע.
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 16:58
נושא ההודעה:
|
זה בדיוק מה שלא ברור לי.
אני לא מצליח לראות פה את "המצביעים" האלו.
המכניקה פה לא ברורה לי, אני זקוק למהלך מהלך שיראה לי מה קורה פה
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 18:08
נושא ההודעה:
|
Anonymous : | fib הוא תמיד כל הסדרה, ו-tail fib הוא תמיד כל הסדרה פרט לאיבר הראשון.
כמובן, זאת בעצמה ההגדרה של הסדרה fib
איך שאני חושב על זה זה שיש לך רק פעם אחת את הרשימה, ואתה שומר שני "מצביעים" למקומות בהם אתה מסתכל
כל פעם אתה מקדם את שניהם, ביחד עם המקום שבו אתה מחשב כרגע. |
טוב אז מסתבר שהמצביעים שאתה מדבר עליהם הם בעצם הפונקציה zip.
זה מה שהיא עושה.
הפעם הראשונה שקוראים לה, היא "חותכת" את שני הראשים של שתי הרשימות (ואז הם מתחברים ונוצר האיבר השלישי ברשימה (2)).
אבל אז שוב קוראים לzip ואכן zip ממשיכה הלאה אל "הצמד" הבא.
מה שמבלבל אותי פה זה שהרשימות גדלות כל הזמן ותוך כדי הגדילה zip מייד מקצצת את הגדילה אבל אז הרשימות גדלות שוב ושוב "נקצצות".
אם אלו היו שתי רשימות ידועות מראש, למשל:
ו-
קוד: | zip ['a','b','c'] [1,2,3] |
פשוט הייתה יוצרת את הרשימה הבאה:
קוד: | [('a',1),('b',2),('c',3)] |
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 18:10
נושא ההודעה:
|
בתקווה שהבנתי נכון כמובן ולא שגיתי בהסבר שלי.
תודה לך איש .
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 18:11
נושא ההודעה:
|
https://i.imgur.com/lDGK2kI.png
אתה "עובר" על הסדרה עם החץ האדום. כשאתה מגיע למקום השלישי אומרים לך - יש כאן עוד שתי סדרות - הראשונה היא בדיוק זאת שאתה עליה עכשיו (החץ הירוק, כשהחץ האדום באיבר השלישי הוא נמצא באיבר הראשון), והשניה היא אותה הסדרה, ללא האיבר הראשון (החץ הכחול, כשהחץ האדום באיבר שלישי הוא נמצא באיבר השני - שהוא בעצם הראשון בסדרה tail fib).
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 18:14
נושא ההודעה:
|
תודה על ההשקעה.
איפה "ציירת" את זה?
כלומר באיזו תוכנה?
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 18:19
נושא ההודעה:
|
אה ניראה לי שכן טעיתי במשהו.
לא קוראים ל- zip כל הזמן כפי שכתבתי, אלא zip פשוט ממשיכה את פעולתה על fib ומכיוון ש- fib גדלה וגדלה (ועל כן גם tail fib), הפונקציה zip ממשיכה "לקצוץ" כל הזמן את שתי הרשימות עד אינסוף.
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 18:23
נושא ההודעה:
|
LibreOffice Writer
|
|
חזרה לתוכן הדיון |
פורסם: 02/11/2017 - 18:33
נושא ההודעה:
|
חשבתי איזה משהו מיוחד
|
|
חזרה לתוכן הדיון |
|