Reduce / Inject
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Ruby של Coddy. שיעור 23 מתוך 56.
לפעמים צריך לצמצם מערך שלם לערך יחיד, לסכום, למכפלה או למחרוזת הארוכה ביותר. reduce (שנקראת גם inject: אותה שיטה, שני שמות) היא הכלי המתאים.
הבלוק מקבל שני פרמטרים: הצובר והאיבר הנוכחי. ערך ההחזרה של הבלוק הופך לצובר הבא.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10שלב אחר שלב, הערך המצטבר הוא 0 → 1 → 3 → 6 → 10.
הארגומנט הראשון הוא ערך ההתחלה של המצבר. אם משמיטים אותו, Ruby משתמשת באיבר הראשון של המערך:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24עבור פעולות טהורות כמו סכום ומכפלה, Ruby מאפשרת לך קיצור דרך: להעביר סמל במקום בלוק:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24ברגע שתוכל לבנות צובר מותאם אישית, תוכל לחשב כמעט כל דבר במעבר אחד.
אתגר
קלקראו רשימה של מספרים שלמים המופרדים בפסיקים. הדפיסו שלוש שורות:
- הסכום (השתמשו ב־
reduce(:+)) - המכפלה (השתמשו ב־
reduce(:*)) - המספר המרבי, שמחושב באמצעות
reduceובלוק מפורש, לא באמצעותmax.
עבור הקלט 2,5,3,8, הפלט הוא:
18
240
8נסו בעצמכם
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: להדפיס את הסכום, המכפלה והערך המרבי (עם reduce + בלוק מפורש)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
סקירה של מתודות למחרוזותאינטרפולציה של מחרוזותמעבר על מחרוזותפיצול וחיבורסיכום – שוזר המחרוזות4בלוקים, Procs ו־Lambdas
מהו בלוק?do..end לעומת סוגריים מסולסליםמילת המפתח yieldפרמטרים של בלוקProcs ו־Lambdasסיכום – איטרטור מותאם אישית7Hashes חלק 2
Hash.new עם ערכי ברירת מחדלמעבר על HashesHashes מקונניםמיזוג ושינויסיכום - מונה תדירויות10פרויקט - רשומות תלמידים
סקירת הפרויקטהוספת תלמיד5עוצמת Enumerable
Select ו־Rejectשרשור MapReduce / Injectcount, all?, any?, none?group_by ו־partitionsort_by, min_by, max_byסיכום - צינור נתוניםתרגלו בעצמכם: קומפיילר Ruby אונליין