01-01-2012, 12:52
|
|
|
חבר מתאריך: 02.03.06
הודעות: 481
|
|
הסברים
בס"ד
אם כן, הסברים:
קוד:
int find_sub_sequence(int *arr,int *sub,int size,int sum)
זהה בדיוק ל:
קוד:
int find_sub_sequence(int arr[],int sub[],int size,int sum)
קטע הקוד הבא:
קוד:
if (!sum) return 1;
if (!size) return 0;
בודק (כמו שהסברתי קודם) אם הסכום המבוקש הוא 0, ואם כן מחזיר 1. (כי יש סכום כזה - הסכום הריק).
אח"כ, בודקים אם גודל המערך הוא 0, ואם כן מחזירים 0. (כי אין איברים, ולכן הסכום האפשרי היחיד הוא 0).
אלה בעצם תנאי העצירה של הרקורסיה.
שתי השורות הבאות יותר מסובכות. הן מהוות את הרקורסיה.
הביטוי arr+1 הוא בעצם הזנב של arr, שמתחיל מהאיבר השני. (כשתלמד מצביעים תבין את זה יותר לעומק).
באופן דומה, sub+1 הוא הזנב של sub, שמתחיל מהאיבר השני.
הביטוי הוא האיבר הראשון של arr. בדיוק כמו
הרעיון של הרקורסיה הוא כזה:
נניח (לדוגמא) שהסכום המבוקש הוא 60, והאיבר הנוכחי הוא 21.
אזי, יש 2 אפשרויות לקבלת הסכום - סכום שכולל את האיבר הנוכחי, או סכום שלא כולל אותו.
כלומר, אם יש באיברים הבאים סכום של 60 או של 39.
הקריאה הרקורסיבית הראשונה בודקת 60, והקריאה השנייה בודקת 39.
אם יש סכום שלא כולל את האיבר הזה (60 בדוגמא), מספיק להחזיר 1.
אם יש סכום שכולל את האיבר הזה (39), צריך לסמן במקום המתאים ב-sub, ואז להחזיר 1.
זה מה שעושה הפקודה
היא (כמעט) זהה לבלוק:
קוד:
{
sub[0]=1;
return 1;
}
ולסיום, אם לא מצאנו סכום מתאים, מחזירים 0.
מקווה שעכשיו הקוד מובן
|