עבור לתוכן

פתרון בעיה בעזרת רקורסיה

Featured Replies

פורסם

יש כאן המון מחשבה, אם אני לא אקבל תשובה ממישהו אני יבין, צריך להיות ממש חד בשביל זה

(במיוחד שעכשיו לילה...)וזה הרבה כאב ראש......

טוב אז...מדובר בסוג של בניית בדיקה אם קיים פתירון לפאזל, הפאזל-אני מקבל מערך של מספרים שלמים, ואינדקס שמשמה מתחילים.

פאזל ש"ניתן לפתירה" זהו פאזל כך שניתן להגיע לתא האחרון במערך (המסומן באפס) אך ורק על ידי תזוזות ימינה או שמאלה במערך,

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

לדוגמא ,

בעבור המערך :

{3,6,4,1,3,4,2,5,3,0}

והאידקס: 0 , הפעולה הרקורסיבית תחזיר שהפאזל ניתן לפתירה.

מדוע ? -פיתרון אפשרי:

מצב התחלתי:

{3,6,4,1,3,4,2,5,3,0}

מהלך ראשון:

{3,6,4,1,3,4,2,5,3,0}

מהלך שני:

{3,6,4,1,3,4,2,5,3,0}

מהלך שלישי:

{3,6,4,1,3,4,2,5,3,0}

מהלך רביעי:

{3,6,4,1,3,4,2,5,3,0}

מהלך חמישי:

{3,6,4,1,3,4,2,5,3,0}

הגעה לאפס-פתרון.

{3,6,4,1,3,4,2,5,3,0}

כתבתי את המתודה הבאה, אבל משום מה היא לא עובדת לי ,

שגיאה : java.lang.StackOverflowError

איך אפשר להגיע לפתרון יותר יעיל? כי אני חושב שאילולא השגיאה הקוד היה מקבל פיתרון תמיד נכון (או אולי לא?)

טוב תודה רבה ולילה מצוין..

[size=10px]public class GetToTheZero {[/size]

[size=10px] private static boolean isSolvableOrNot=false;[/size]
[size=10px] [/size]
[size=10px] public static boolean isSolvable(int start, int[] board) {[/size]
[size=10px] if (board[start]==0){[/size]
[size=10px] isSolvableOrNot=true; [/size]
[size=10px] }[/size]
[size=10px] else {[/size]
[size=10px] if (start-board[start]>=0) {[/size]
[size=10px] return isSolvable(start-board[start], board);[/size]
[size=10px] }[/size]
[size=10px] if (start+board[start]<board.length){[/size]
[size=10px] return isSolvable(start+board[start], board);[/size]
[size=10px] }[/size]
[size=10px] }[/size]
[size=10px] return isSolvableOrNot;[/size]
[size=10px] }[/size]


פורסם

ברוך הבא לפורום.

ערוך בבקשה את הכותרת כך שתכיל את תמצית השאלה, וערוך את ההודעה ושים את הקוד בתוך טג קוד (כפתור עם ציור #) כדי שיהיה יותר קריא.

פורסם
  • מחבר

מישהו?

פורסם

stack overflow אומר שהרקורסיה שלך יורדת עמוק מדי (כלומר יותר מדי פעמים שהפונקציה קוראת לעצמה בתוך עצמה, כנראה אינסוף). זה אומר שכנראה תנאי העצירה שלך לא מוגדר היטב, שהקריאה הרקורסיבית לא טובה. במקרה הזה הבעיה ברורה - הרקורסיה שלך לא "מצמצמת" בשום שלב את הקלט, ככה שאתה יכול להיתקע ברקורסיה אינסופית (לדוגמה, תאר לך שני תאים שיש בהם 3, במרחק בדיוק 3 זה מזה - אז תלך 3 צעדים ימינה, ואז 3 שמאלה, וחוזר חלילה...)

לשאלתך: קודם כל, אל תשתמש במשתנים סטטיים חיצוניים לפונקציה, כי זה מביס את כל המטרה של הרקורסיה. אם יש מידע שאתה רוצה להעביר מקריאה לקריאה של הפונקציה, אז תשתמש בפרמטר נוסף לפונקציה ובערך ההחזרה (ספציפית, שימוש במשתנה סטטי כזה גם יגרום לכך שאי אפשר יהיה להפעיל את הפונקציה יותר מפעם אחת...)

חוץ מזה, הלוגיקה שלך שגויה. שים לב שב-if הראשון אתה בודק אם אפשר ללכת שמאלה, ואם כן - אז אתה תמיד הולך שמאלה, ובכלל לא בודק את האופציה של ללכת ימינה, למרות שיכול שהצעד שמאלה יתקע אותך בעוד צעד ימינה יביא אותך לסוף המערך.

נ.ב. קרא בבקשה את חוקי הפורום, ואל תקפיץ נושא לפני שעברו 24 שעות מההודעה האחרונה בו.

פורסם
  • מחבר

וואו..

תודה רבה ,!

מצטער על ההקפצה הזאת, פעם ראשונה אני נמצא בפורום כל שהוא....

אם עולה לך איזה כיוון לפתירה אני ישמח מאוד.. שבת שלום !

פורסם

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

הבעיה היא שאין לאלגוריתם שלך שום תנאי עצירה. כמו שאמרתי, אתה יכול בטעות להיתקע בלולאה אינסופית של ימינה-שמאלה-ימינה-שמאלה (או משהו יותר מורכב מזה, כמו 2 ימינה -> 2 ימינה -> 4 שמאלה וחוזר חלילה). אתה צריך איכשהו לוודא שאתה לא עושה דברים כאלה.

פורסם

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

כמו ששניצל אמר, תראה איך אתה בודק שאתה לא חוזר שוב ושוב על אותם הצעדים.

פורסם
  • מחבר

וואי אוף ניראה כאילו זה ממש קל לכם

פורסם

עם הזמן והלימודים אתה תגלה שאמנם יש אינסוף בעיות שונות אבל רובן ניתנות לחלוקה למחלקות שקילות וסוגי האלגוריתמים הפותרים אותם דומים.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים