פורסם 2012 בדצמבר 612 שנים יש כאן המון מחשבה, אם אני לא אקבל תשובה ממישהו אני יבין, צריך להיות ממש חד בשביל זה(במיוחד שעכשיו לילה...)וזה הרבה כאב ראש......טוב אז...מדובר בסוג של בניית בדיקה אם קיים פתירון לפאזל, הפאזל-אני מקבל מערך של מספרים שלמים, ואינדקס שמשמה מתחילים.פאזל ש"ניתן לפתירה" זהו פאזל כך שניתן להגיע לתא האחרון במערך (המסומן באפס) אך ורק על ידי תזוזות ימינה או שמאלה במערך, כך שמספר הצעדים ימינה או שמאלה הם כמספר הערך שבמערך במקום בו אתה עומד.לדוגמא ,בעבור המערך : {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]
פורסם 2012 בדצמבר 612 שנים ברוך הבא לפורום.ערוך בבקשה את הכותרת כך שתכיל את תמצית השאלה, וערוך את ההודעה ושים את הקוד בתוך טג קוד (כפתור עם ציור #) כדי שיהיה יותר קריא.
פורסם 2012 בדצמבר 712 שנים stack overflow אומר שהרקורסיה שלך יורדת עמוק מדי (כלומר יותר מדי פעמים שהפונקציה קוראת לעצמה בתוך עצמה, כנראה אינסוף). זה אומר שכנראה תנאי העצירה שלך לא מוגדר היטב, שהקריאה הרקורסיבית לא טובה. במקרה הזה הבעיה ברורה - הרקורסיה שלך לא "מצמצמת" בשום שלב את הקלט, ככה שאתה יכול להיתקע ברקורסיה אינסופית (לדוגמה, תאר לך שני תאים שיש בהם 3, במרחק בדיוק 3 זה מזה - אז תלך 3 צעדים ימינה, ואז 3 שמאלה, וחוזר חלילה...)לשאלתך: קודם כל, אל תשתמש במשתנים סטטיים חיצוניים לפונקציה, כי זה מביס את כל המטרה של הרקורסיה. אם יש מידע שאתה רוצה להעביר מקריאה לקריאה של הפונקציה, אז תשתמש בפרמטר נוסף לפונקציה ובערך ההחזרה (ספציפית, שימוש במשתנה סטטי כזה גם יגרום לכך שאי אפשר יהיה להפעיל את הפונקציה יותר מפעם אחת...)חוץ מזה, הלוגיקה שלך שגויה. שים לב שב-if הראשון אתה בודק אם אפשר ללכת שמאלה, ואם כן - אז אתה תמיד הולך שמאלה, ובכלל לא בודק את האופציה של ללכת ימינה, למרות שיכול שהצעד שמאלה יתקע אותך בעוד צעד ימינה יביא אותך לסוף המערך.נ.ב. קרא בבקשה את חוקי הפורום, ואל תקפיץ נושא לפני שעברו 24 שעות מההודעה האחרונה בו.
פורסם 2012 בדצמבר 712 שנים מחבר וואו.. תודה רבה ,!מצטער על ההקפצה הזאת, פעם ראשונה אני נמצא בפורום כל שהוא.... אם עולה לך איזה כיוון לפתירה אני ישמח מאוד.. שבת שלום !
פורסם 2012 בדצמבר 712 שנים למעשה זו בעיה שהרבה יותר קל לפתור באמצעות תכנון דינמי, אבל אני מניח שהדרישה היא רקורסיה...הבעיה היא שאין לאלגוריתם שלך שום תנאי עצירה. כמו שאמרתי, אתה יכול בטעות להיתקע בלולאה אינסופית של ימינה-שמאלה-ימינה-שמאלה (או משהו יותר מורכב מזה, כמו 2 ימינה -> 2 ימינה -> 4 שמאלה וחוזר חלילה). אתה צריך איכשהו לוודא שאתה לא עושה דברים כאלה.
פורסם 2012 בדצמבר 712 שנים תחשוב מה תנאי העצירה שלך ומה יקרה למשל אם תתחיל הפוך דווקא. מהתא האחרון כל פעם לראות אם אתה יכול להגיע אליו.כמו ששניצל אמר, תראה איך אתה בודק שאתה לא חוזר שוב ושוב על אותם הצעדים.
פורסם 2012 בדצמבר 712 שנים עם הזמן והלימודים אתה תגלה שאמנם יש אינסוף בעיות שונות אבל רובן ניתנות לחלוקה למחלקות שקילות וסוגי האלגוריתמים הפותרים אותם דומים.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.