נניח שיש לנו אוסף ואנחנו מעוניינים לחשב את אוסף האוספים החלקיים שלו (כאשר לא אכפת לנו מסדר, אלא רק מהאיברים שמופיעים בו).
ניתן לעשות זאת בצורה מעניינת בעזרת מספר Featureים של השפה:
|
|
מה קורה כאן? אם האוסף ריק, אנחנו מחזירים אוסף המכיל את התת קבוצה היחידה שיש – האוסף עצמו.
אם האוסף לא ריק, אנחנו מחשבים ברקורסיה את אוסף תת הקבוצות של כל האיברים פרט לאיבר הראשון.
אחרי זה אנחנו עוברים על כל התת קבוצות האלה, ומחזירים כל איבר פעמים: פעם אחת בתור הקבוצה בלי האיבר שהסרנו, ופעם נוספת בתור קבוצה עם האיבר שהסרנו.
זה די מזכיר את הקוד של הפרמוטציות (ראו גם טיפ מספר 172). הוספתי תיעוד כך שהקוד די מסביר את עצמו.
מה שטוב כאן, זה שהחישוב הוא Lazy, לכן הוא לא יתבצע עד שנעבור על האיבר המתאים בforeach (או נקרא לMoveNext המתאים). ראו גם טיפים מספר 54-55.
שימו לב שעבור אוספים אינסופיים הדבר הזה לא עובד, וגם לא יכול לעבוד, שהרי קבוצת החזקה של קבוצה אינסופית, היא לא קבוצה בת מנייה.
מומלץ לקרוא בויקיפדיה גם על משפט קנטור (יש שם הסבר אינטואיטיבי נחמד) ו האלכסון של קנטור.
סופ"ש חזק.