לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #2  
ישן 16-10-2008, 13:34
  sigsig sigsig אינו מחובר  
 
חבר מתאריך: 23.11.07
הודעות: 187
בתגובה להודעה מספר 1 שנכתבה על ידי sivan1233210 שמתחילה ב "פעולות רקורסיביות ב - #C"

טוב, היות ולאחרונה חוזרות פה שוב ושוב השאלות לגבי רקורסיה, אני אנסה להסביר איך ניגשים לפיתרון של שאלה רקורסיבית.
קודם כל, חשוב להבין מה זה רקורסיה, ו-'לקבל תחושה' לאיך עובד התהליך הרקורסיבי. ניתן להתייחס לרקורסיה בעצם כמעין סוג של 'חשיבה חיובית' או 'תחשוב טוב - יהיה טוב'. למה? כי בעצם רקורסיה זה לפתור משהו קטן ופשוט, ומישהו אחר יפתור את השאר. או להיפך - מישהו פתר כבר כמעט את הכל, ועכשיו נשאר לנו לפתור רק את הקצת שנשאר.
ניקח דוגמא פשוטה - נכתוב פונקציה רקורסיבית שמקבלת ערך n כלשהוא, ונדפיס את כל המספרים מ-1 עד n. כאמור, 'תחשוב טוב - יהיה טוב'. במקרה הזה, נתחיל עם 'יהיה טוב': אמרנו למישהו להדפיס כבר את כל המספרים מ-1 עד n-1, והוא עשה את זה. כל מה שנשאר לנו - 'לחשוב טוב' - זה להדפיס את n. זהו זה. סיימנו.
איך נגיד לאותו מישהו להדפיס את כל המספרים מ-1 עד n-1? מה הבעייה, הרי כבר יש לנו פונקציה שמדפיסה את כל המספרים מ-1 עד n - הרגע כתבנו אותה! פשוט נקרא לה עם הערך n-1. וגם כאן - יהיה טוב' ומישהו ידפיס לנו את כל הערכים מ-1 עד n-2, ואז 'נחשוב טוב' ונדפיס את n-1. ושוב - 'יהיה טוב', ומישהו ידפיס את כל הערכים מ-1 ועד n-3, ו'נחשוב טוב' בעצמנו ונדפיס את n-2. וכך הלאה והלאה והלאה, עד שנרצה להדפיס את כל המספרים מ-1 עד 1. פה זה כבר קל - נדפיס 1 וסיימנו. לא צריך לבקש טובות מאף אחד יותר.
ונסכם - פונקציה רקורסיבית מורכבת משני חלקים:
הראשון, מה עושים בסוף, כשלא צריך יותר טובות (כלומר, קריאות רקורסיביות) מאף אחד,
והשני, שבו אנחנו עושים משהו פשוט ומבקשים טובה (= קריאה רקורסיבית) ממישהו אחר שיעשה בשבילנו את יתר העבודה. או בסדר הפוך - מישהו עשה בשבילנו (= קריאה רקורסיבית) חלק גדול מהעבודה והשאיר לנו רק משהו קטן לעשות.

קוד:
public void PrintToN(int n) { if(n == 1) Console.WriteLine("1"); else { PrintToN(n-1); Console.WriteLine(n); } }
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 16-10-2008, 16:55
  eXeCuTeR+ eXeCuTeR+ אינו מחובר  
 
חבר מתאריך: 19.10.07
הודעות: 65
בתגובה להודעה מספר 3 שנכתבה על ידי sivan1233210 שמתחילה ב "בס"ד אני הבנתי את זה אבל..."

פתרון תרגיל 1:
קוד:
void printit(int num) { if (num == 4) Console.WriteLine("4, 4"); else { Console.WriteLine("{0}, {1}", num, num); a(num + 1); Console.WriteLine("{0}, {1}", num, num); } }


מה שקורה בעצם זה שבהתחלה יוצג 1,1, 2,2, 3,3, ואח"כ כשזה יגיע ל4,4, אין קריאות רקורסיביות נוספות ולכן שאר הקוד בהתאמה יתבצע ויוצג 3, 3, 2, 2, 1, 1.

תרגיל 2:
די מבוסס על התרגיל הקודם, יתבצע בצורה הבאה:
קוד:
void print(int num) { if (num == 7) Console.WriteLine("7"); else { Console.WriteLine("{0}", num); a(num + 1); if(num % 2 == 0) Console.WriteLine("{0}", num); } }


אין ממש הבדל חוץ מהתנאי שהוספתי שהכרחי לסדרה.

תרגיל 3:
קוד:
int pow(int a, int b) { if(b == 0) return 1; return a * pow(a, b - 1); }


אני אתן דוגמא למה שקורה:
קוד:
pow(3, 2) 3 * pow(3, 1) 3 * pow(3, 0) 1 is returned 3 * 1 = 3 is returned 3 * 3 ואין קריאות נוספות לפונקציה ולכן מוחזר הערך.


התרגיל הזה גם הוא די דומה לתרגיל הקודם:
קוד:
int multiply(int a, int b) { if(b == 1) return a; return a + multiply(a, b - 1); }


דוגמא להמחשה:
קוד:
multiply(3, 3) 3 + multiply(3, 2) 3 + multiply(3, 1) 3 is returned 3 + 3 3 + 6 אין עוד קריאות נוספות ולכן יוחזר הערך.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 09:27

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר