מעבר מרקורסיה לאיטרציה
אקדים ואומר שאני מתנצל, ואין לי נסיון רב במדמ"ח. לא למדתי מדמ"ח בביה"ס ובטח שלא במוסד להשכלה גבוהה, ותכנות אני יודע כשנה וחצי. יש לי בעיה תכנותית שנפתרת בצורה די פשוטה בעזרת רקורסיה, אולם לפי מה שהבנתי מחכמים ממני בפורום שפות תכנות, כמעט לא נהוג לפתור בעיה בצורה רקורסיבית, אלא ממירים את הפתרון לפתרון איטרטיבי. עד כאן אני מקווה שצדקתי, והנה הבעיה: מדובר על משחק לוח דטרמניסטי לחלוטין, אך בניגוד לשחמט המטרה היא אינה אחת ויחידה (ללכוד את המלך), אלא פשוט להשיג ניקוד יותר גבוה משל היריב שלך. המשחק מסתיים כאשר אין יותר אפשרות להזיז אף כלי. ההנחה היא שביכולתו של המחשב לחשב מספיק רחוק עד לסוף עץ האפשרויות (הלוח מאוד קטן). הפתרון שלי למציאת המהלך הטוב ביותר היתה יצירת פונקציה שתקרא "getValue" שבודקת כל מהלך אפשרי. אם אין יותר מהלכים אפשריים, היא מחשבת את ההפרש בנקודות בין השחקן הלבן והשחקן השחור. אם ישנם עדיין מהלכים אפשריים, היא משנה את הלוח כל פעם בהתאם להם וקוראת לgetValue שוב, כאשר היא שומרת את המהלך שהחזיר את הערך המוחזר הכי קטן אם היא מנסה למצוא פתרון בשביל הלבן, ואת הערך הכי גדול אם היא מנסה למצוא פתרון בשביל השחור, כלומר מנסה למצוא את המהלך האופטימלי לכל צד. הלוח מיושם במחסנית. הפסודו קוד:
אקדים ואומר שאני מתנצל, ואין לי נסיון רב במדמ"ח. לא למדתי מדמ"ח בביה"ס ובטח שלא במוסד להשכלה גבוהה, ותכנות אני יודע כשנה וחצי. יש לי בעיה תכנותית שנפתרת בצורה די פשוטה בעזרת רקורסיה, אולם לפי מה שהבנתי מחכמים ממני בפורום שפות תכנות, כמעט לא נהוג לפתור בעיה בצורה רקורסיבית, אלא ממירים את הפתרון לפתרון איטרטיבי. עד כאן אני מקווה שצדקתי, והנה הבעיה: מדובר על משחק לוח דטרמניסטי לחלוטין, אך בניגוד לשחמט המטרה היא אינה אחת ויחידה (ללכוד את המלך), אלא פשוט להשיג ניקוד יותר גבוה משל היריב שלך. המשחק מסתיים כאשר אין יותר אפשרות להזיז אף כלי. ההנחה היא שביכולתו של המחשב לחשב מספיק רחוק עד לסוף עץ האפשרויות (הלוח מאוד קטן). הפתרון שלי למציאת המהלך הטוב ביותר היתה יצירת פונקציה שתקרא "getValue" שבודקת כל מהלך אפשרי. אם אין יותר מהלכים אפשריים, היא מחשבת את ההפרש בנקודות בין השחקן הלבן והשחקן השחור. אם ישנם עדיין מהלכים אפשריים, היא משנה את הלוח כל פעם בהתאם להם וקוראת לgetValue שוב, כאשר היא שומרת את המהלך שהחזיר את הערך המוחזר הכי קטן אם היא מנסה למצוא פתרון בשביל הלבן, ואת הערך הכי גדול אם היא מנסה למצוא פתרון בשביל השחור, כלומר מנסה למצוא את המהלך האופטימלי לכל צד. הלוח מיושם במחסנית. הפסודו קוד:
int getValue() { for each move { if (move is possible) { board.push(move); int moveValue=getValue(); board.pop(); if(black) { if(moveValue>best Value) { store current move as best move; } } else// white { if(moveValue<best Value) { store current move as best move; } } } else { continue; } } if(no moves were possible) { caculate score; return score; } else { return best move's value; } }
הפונקציה הזו נקראת כאשר בודקים את כל המהלכים האפשריים כדי לראות איזה מהם יניב את התוצאה הכי גבוהה. השאלה, כיצד אני מתרגם את הפתרון הזה לפתרון איטרטיבי?