לחלק מאיתנו עלה הצורך בעבר למצוא את כל התמורות של אוסף מסוים.
כלומר, למצוא את כל הסידורים האפשריים של אוסף מסוים.
לכתוב קוד כזה בד”כ דורש רקורסיה ויוצא משהו די מכוער.
בזכות מספר Featureים של השפה, ניתן לכתוב קוד כדוגמת זה בצורה יפה:
|
|
מה שקורה כאן זה שאנחנו מקבלים אוסף ומחזירים אוסף של אוספים שמכיל את כל הסידורים האפשריים של האוסף המקורי.
איך זה עובד? כתבתי תיעוד, אבל מה שקורה זה ככה:
אם קיבלנו אוסף ריק, אנחנו מחזירים אוסף שמכיל את האוסף הריק.
אם קיבלנו אוסף אחר, אנחנו רצים על כל האיברים שלו. כל איבר כזה אנחנו מעמידים במקום הראשון באוסף ואת שאר האיברים מסדרים ברקורסיה.
שימו לב לשימוש היפה בyield return – חוץ מההתעסקות בערך ההחזר של הפונקציה, לא הייתי צריך כל הפונקציה לדעת שאני מחזיר אוסף של אוספים.
מה שעוד יפה בפונקציה זו, זה שבגלל שהיא משתמשת בyield return , אזי היא Lazy ולכן אינה מפוצצת את הזכרון בכל התמורות בקריאה אליה.
ראו גם טיפים מספר 54,55,105
שבוע טוב