
05-04-2010, 09:38
|
|
|
|
חבר מתאריך: 04.04.10
הודעות: 4
|
|
הי
רקורסיה, אף פעם לא קל,
יש כמה סוגי פיתרון לכל מיני בעיות ברקורסיה.
בעיית המדרגות היא בעיית (אני קורא לה) רקורסיה קומבינטורית.
אני אראה לך שתי בעיות שונות שהם ממש אותו פיתרון.
כמה כללים שכדאי לדעת על רקורסיה:
1) רקורסיה צריכה תנאי עצירה.
בתנאי העצירה אפשר רק לסיים, או להדפיס תוצאת ביניים, או לבצע איזו חישוב לשלב הבא, או איפוס
של משתנים לפני שממשיכים.
2) כל משתנה בתוך הפונקציה או משתנה שמועבר לפונקציה , במידה והפונקציה לא תסתיים כי היא קראה לעצמה יידחף למחסנית.
3) כל הקריאות לפונקציות אחרות וכל קוד שלא בוצע בהמשך הפונקציה כי קראו לפונקציה שוב
יידחף למחסנית.
4) כאשר הפונקציה הקוראת לעצמה תעצר בתנאי העצירה, היא תמשיך בביצוע שאר התוכנית על ידי שליפה של המשתנים והקוד מהמחסנית.
בעיית המדרגות דומה מאד לבעייה קומבינטורית אחרת.
נתון מערך בגודל 3 - {}=[3]my_array
מאותחל ב a,b,c
צריך להדפיס את כל החזרות האפשריות.
שהם בעצם 3 בחזקת 3 = 27 אפשרויות שונות עם חזרות - כלומר צריך גם aaa , bbb וכדומה.
זה הפתרון ל 4 אברים , a,b,c,d -
כלומר 4 בחזקת 4 = 256 אפשריות
int count = 0;
void kmbinatorics(char* my_array, int curPlace)
{
if (my_array[curPlace] == '\0')
{
printf("%s\t",my_array);
count++;
return;
}
my_array[curPlace] = 'a';
kmbinatorics (my_array,curPlace+1);
my_array[curPlace] = 'b';
kmbinatorics (my_array,curPlace+1);
my_array[curPlace] = 'c';
kmbinatorics (my_array,curPlace+1);
my_array[curPlace] = 'd';
kmbinatorics (my_array,curPlace+1);
}
int main(int argc, char* argv[])
{
char str[5];
str[4]= '\0';
kmbinatorics(str,0);
printf("count = %d\n" , count);
return 0;
}
בעיית המדרגות היא בדיוק אותו דבר.
תנסה את הדברים הבאים:
1) תקמפל ותריץ את התוכנית.
תעקוב אחרי curPlace
תראה איך הוא נישלף מהמחסנית.
הכתיבה הרקורסיבית הזו תיתן לך את כל האפשרויות
במדרגות: אתה צריך את כל האפשרויות למשל:
2,2,2,3
2,3,2,3,
2,3,3,3
3,2,3,2
וכך הלאה.
רמז: אתה קורא לפונקציה פעם עם התקדמות ב 2 ופעם עם התקדמות ב 3.
תחשוב גם מה אתה רוצה לעשות בכל איטרציה לפני שאתה קורא לפונקציה ומה בתנאי העצירה
easp13 at walla.com
easp13 at gmail.com
|