נגדיר: סדרה עולה ממש היא סדרה של מספרים שלמים חיוביים שכל איבר בה גדול ממש מהאיבר הקודם בסדרה (פרט לאיבר הראשון).

כתבו שיטה סטטית רקורסיבית בשם count המקבלת כפרמטר מספר שלם לא שלילי sum
ומחזירה את מספר הסדרות העולות ממש שסכום האיברים שלהן (של כל אחת בנפרד) שווה ל־sum.

לדוגמה, עבור sum = 7 השיטה count תחזיר את הערך 5, שכן יש בדיוק 5 סדרות עולות
ממש שסכום האיברים שלהן שווה ל־7. להלן הסדרות:

  1. (1, 2, 4)
  2. (1, 6)
  3. (2, 5)
  4. (3, 4)
  5. (7)

שימו לב: הסדרה הריקה גם היא סדרה עולה ממש וסכום האיברים שלה שווה לאפס.

חתימת השיטה היא:

public static int count(int sum)

כדי לפתור את השאלה באופן רקורסיבי, כדאי לשאול את עצמנו:

  • איך אפשר "לבנות" סדרה עולה ממש באופן הדרגתי?
  • אם אנחנו כבר נמצאים באמצע בניית הסדרה, מהו המספר הקטן ביותר שנוכל להוסיף לה, כך שהתנאי של "עולה ממש" יישמר?

טיפ:

במקום לבדוק את כל האפשרויות מ-1 בכל שלב, השתמשו בפרמטר נוסף שייצג את המספר המינימלי שניתן לבחור ממנו והלאה. נניח שהפרמטר יקרא start. בתחילת הריצה הוא יהיה 1, ובכל שלב רקורסיבי תבחרו מספר i החל מ־start, ותקראו לפונקציה עם sum - i ועם start = i + 1.

מתי עוצרים?

  • אם sum == 0 → מצאתם סדרה תקפה.
  • אם sum < start → אין יותר אפשרויות חוקיות.

שימו לב:

  • ברקורסיה אנחנו לא בונים בפועל את הסדרות – רק סופרים את מספר האפשרויות!
  • כל קריאה רקורסיבית מציינת המשך של סדרה אפשרית חדשה.

בהצלחה 😊