-
בעיה|C# רקורסיה
3. נתון לוח משבצות בגודל 10x10. במשבצת השמאלית העליונה (1,1) מונח מטבע. יש להעבירו למשבצת הימנית התחתונה (10,10). בכל צעד מותר
להזיז את המטבע משבצת אחד ימינה או למטה. כתוב תכנית הנעזרת בפעולה רקורסיבית המחשבת מספר המסלולים השונים
שבהם ניתן להעביר את המטבע מהמשבצת (1,1) למשבצת (10,10). על התכנית יש להדפיס את מספר המסלולים האלה.
4. נגדיר תהליך חישוב מספר ביקורת, למספר טבעי כלשהו, בצורה הבאה: מחשבים את סכום של כל הספרות, ואם הסכום הכולל מכיל יותר מספרה
אחת מחשבים שוב את סכום של כל הספרותיו. כך נמשיך עד שהסכום יורכב מספרה אחד בלבד והיא מהווה את ספרת הביקורת.
לדוגמא: עבור מספר 734321891 הסכום יהיה 38, המספר כולל יותר מספרה אחד, לכן נחשב שוב את סכום ספרות ונקבל 11, ושוב נחשב את סכם
הספרות ואז נקבל 2, והיא ספרת הביקורת. כתוב תכנית הקולטת מחרוזת אשר מציינת מספר תעודת זהות, ומזמנת פעולה רקורסיבית המחזירה את
ספרת הביקורת .על התכנית יש להדפיס את ספרת הביקורת המתאימה לתעודת הזהות הנקלט.
5. נתונה סידרה הבאה: 0,1,1,2,5,29,……. . בסדרה זו האיבר הראשון 0, האיבר השני 1, וכל איבר אחר בסדרה הוא סכום ריבועי שני האיברים
שלפניו.
א. כתוב פעולה רקורסיבית המקבלת מספר טבעי N, מספר סידורי של האיבר ומחזירה את ערכו.
ב. כתוב פעולה רקורסיבית המקבלת מספר טבעי N, מספר סידורי, ומחזירה את סכום של N האיברים הראשונים בסדרה הזו.
בשאלה השניה והשלישית אני צריך תנאי שיעזור לי לצאת מהפעולה, ובראשון אין לי מושג מה הבנאדם רוצה מהחיים שלי):
-
3. התכנית תלך כך (אני לא נכנס לפרטים כי אני לא מכיר את התחביר)
אם הלוח הוא בגודל 1 על 1, תחזיר 1;
בכל מקרה אחר תחזיר את הסכום של תוצאת הפעולה כשאתה מגדיל שורה ב-1, ולא משנה את העמודה, ואת תוצאת הפעולה כשאתה מגדיל עמודה ב-1 ולא משנה את השורה.
4. התנאי הוא, כמובן, קלט קטן מ-10.
5. א. התנאי הוא פשוט אם N הוא 1 או 2 להחזיר את הערך הידוע.
ב. את השאלה הזו אפשר בלי רקרוסיה, אלא פשוט לעשות את זה בלולאה, אבל אפשר גם כמובן ברקרוסיה, ואז התנאי הוא ב-1 להחזיר 0, ולכל N להחזיר את האיבר ה-n פלוס "הסכום של" על N-1.
-
[QUOTE=LordAbizi;1394447]3. התכנית תלך כך (אני לא נכנס לפרטים כי אני לא מכיר את התחביר)
אם הלוח הוא בגודל 1 על 1, תחזיר 1;
בכל מקרה אחר תחזיר את הסכום של תוצאת הפעולה כשאתה מגדיל שורה ב-1, ולא משנה את העמודה, ואת תוצאת הפעולה כשאתה מגדיל עמודה ב-1 ולא משנה את השורה.
4. התנאי הוא, כמובן, קלט קטן מ-10.
5. א. התנאי הוא פשוט אם N הוא 1 או 2 להחזיר את הערך הידוע.
ב. את השאלה הזו אפשר בלי רקרוסיה, אלא פשוט לעשות את זה בלולאה, אבל אפשר גם כמובן ברקרוסיה, ואז התנאי הוא ב-1 להחזיר 0, ולכל N להחזיר את האיבר ה-n פלוס "הסכום של" על N-1.[/QUOTE]
נאמ ב4 יצאתי אהבל חחח
את חמש אני כבר אנסה.
והבעיה בשלוש זה שצריך לעשות את זה בכמה דרכים(נגיד 1,1 2,1 2,2 ו1,1 2,1 3,1 ...) אם זה היה רק דרך אחת זה היה תרגיל קל.
-
[quote=Flupy;1394448]נאמ ב4 יצאתי אהבל חחח
את חמש אני כבר אנסה.
והבעיה בשלוש זה שצריך לעשות את זה בכמה דרכים(נגיד 1,1 2,1 2,2 ו1,1 2,1 3,1 ...) אם זה היה רק דרך אחת זה היה תרגיל קל.[/quote]
לא הבנתי? אני מתחיל ממשבצת 1,1. כל מסלול שלי, יתחיל או בתזוזה ימינה, או בתזוזה למטה. אם אני אחשב כמה מסלולים יש לי אחרי תזוזה ימינה, ואחבר לזה את מספר המסלולים שיש לי אחרי תזוזה למטה, אני אקבל את סך כל המסלולים שיש לי. זה צעד הרקורסיה. תנאי העצירה הוא כשאני מגיע ל-10,10, ואז יש לי רק דרך אחת להגיע, ל-10,10, והיא לא לעשות כלום. (אפשר להסתכל על זה אחרת - כל פעם שאני מגיע ל-10,10, אז סיימתי איזשהו מסלול, אז אני מוסיף 1 למניית המסלולים).
ככה בוודאות אתה תספור כל מסלול שיש. תנסה מקרה פשוט יותר על הנייר אם אתה רוצה לבדוק את זה.
-
[QUOTE=LordAbizi;1394449]לא הבנתי? אני מתחיל ממשבצת 1,1. כל מסלול שלי, יתחיל או בתזוזה ימינה, או בתזוזה למטה. אם אני אחשב כמה מסלולים יש לי אחרי תזוזה ימינה, ואחבר לזה את מספר המסלולים שיש לי אחרי תזוזה למטה, אני אקבל את סך כל המסלולים שיש לי. זה צעד הרקורסיה. תנאי העצירה הוא כשאני מגיע ל-10,10, ואז יש לי רק דרך אחת להגיע, ל-10,10, והיא לא לעשות כלום. (אפשר להסתכל על זה אחרת - כל פעם שאני מגיע ל-10,10, אז סיימתי איזשהו מסלול, אז אני מוסיף 1 למניית המסלולים).
ככה בוודאות אתה תספור כל מסלול שיש. תנסה מקרה פשוט יותר על הנייר אם אתה רוצה לבדוק את זה.[/QUOTE]
יש מצב אתה כותב את זה בJAVA ? ברעיון הבנתי איך לעשות את זה, אבל על הנייר ...
-
[quote=Flupy;1394450]יש מצב אתה כותב את זה בJAVA ? ברעיון הבנתי איך לעשות את זה, אבל על הנייר ...[/quote]
אוקיי.[code]
[LEFT]public int countWays(int x, int y)
{
הנחה: X,Y בין 1 ל-10.
if(x==10 && y == 10)
return 1;
if( x>10 || y>10)
return 0;
אם באחד הכיוונים אני עובר את ה-0, אני בשום דרך כבר לא אגיע ל-10,10 ולכן אני חייב להחזיר פה 0.
else
return countWays(x+1,y) + countWays(x, y+1);
}[/LEFT]
[/code]
ואז הפעולה שאתה מבצע היא:
countWays(1,1).