ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
אורח · ·
 

הודעה פורסם: 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
נושא ההודעה:

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

הודעה פורסם: 02/11/2017 - 18:08
נושא ההודעה:

Anonymous :
fib הוא תמיד כל הסדרה, ו-tail fib הוא תמיד כל הסדרה פרט לאיבר הראשון.
כמובן, זאת בעצמה ההגדרה של הסדרה fib

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


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

אם אלו היו שתי רשימות ידועות מראש, למשל:
קוד:
['a','b','c']
ו-
קוד:
[1,2,3]



קוד:
zip ['a','b','c'] [1,2,3]


פשוט הייתה יוצרת את הרשימה הבאה:
קוד:
[('a',1),('b',2),('c',3)]
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 02/11/2017 - 18:10
נושא ההודעה:

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

הודעה פורסם: 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 Very Happy
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 02/11/2017 - 18:33
נושא ההודעה:

חשבתי איזה משהו מיוחד Laughing
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. אורח
  2. אורח
  3. אורח
  4. אורח
  5. אורח
  6. אורח
  7. אורח
  8. אורח
  9. אורח
  10. אורח
  11. אורח
  12. אורח
  13. אורח

Google Ads