שאלת מבחן במבוא למדעי המחשב - הטכניון 2020 - רקורסיה
שאלה 4 (25 נקודות):
נתונה מחרוזת str שמכילה אותיות אנגלית גדולות בלבד. ממשו פונקציה שמדפיסה פעם אחת כל מחרוזת שניתן להרכיב מהתווים של המחרוזת הנתונה בסדר למילוני (לקסיקוגרפי).
דוגמה:
בהינתן מחרוזת
A
AA
AAB
AABS
AAS
AASB
AB
ABA
ABAS
ABS
ABSA
AS
ASA
ASAB
ASB
ASBA
הערות:
• יש להשתמש בשיטת backtracking כפי שנלמדה בכיתה.
• בשאלה זו אין דרישות סיבוכיות, אולם כמקובל ב-backtracking יש לוודא שלא מתבצעות קריאות רקורסיביות מיותרות עם פתרונות שאינם חוקיים.
• ניתן ומומלץ להשתמש בפונקציות עזר (ויש לממש את כולן).
נתונה מחרוזת str שמכילה אותיות אנגלית גדולות בלבד. ממשו פונקציה שמדפיסה פעם אחת כל מחרוזת שניתן להרכיב מהתווים של המחרוזת הנתונה בסדר למילוני (לקסיקוגרפי).
דוגמה:
בהינתן מחרוזת
"SAAB", הפונקציה תוציא את הפלט הבא (רק 16 מילים ראשונות מופעיות):A
AA
AAB
AABS
AAS
AASB
AB
ABA
ABAS
ABS
ABSA
AS
ASA
ASAB
ASB
ASBA
הערות:
• יש להשתמש בשיטת backtracking כפי שנלמדה בכיתה.
• בשאלה זו אין דרישות סיבוכיות, אולם כמקובל ב-backtracking יש לוודא שלא מתבצעות קריאות רקורסיביות מיותרות עם פתרונות שאינם חוקיים.
• ניתן ומומלץ להשתמש בפונקציות עזר (ויש לממש את כולן).
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
הטכניוןמועד א2020סמסטר א
★★★★★
רקורסיהרקורסיה עם מעקבמחרוזותפרמוטציות
מיינו את תווי המחרוזת לפני תחילת ה-backtracking — כך סדר הבחירות יהיה לקסיקוגרפי באופן טבעי. כדי להימנע מכפילויות כשיש תווים חוזרים, דלגו על תו אם ו-.
רעיון הפתרון: נמיין את תווי המחרוזת לסדר לקסיקוגרפי, ואז נשתמש ב-backtracking כך שבכל שלב נבחר תו זמין ונוסיף אותו למחרוזת הנוכחית. כדי להימנע מהדפסת מחרוזות כפולות (כשיש תווים חוזרים), נדלג על תו אם קיים לפניו תו זהה שטרם נבחר באותה רמת רקורסיה.
תנאי דילוג (למניעת כפילויות):
אם
מימוש:
מעקב על `"SAAB"` (לאחר מיון: `"AABS"`):
הפלט מתחיל בדיוק כנדרש:
נכונות backtracking: לא מתבצעת רקורסיה מיותרת — הקריאה הרקורסיבית מתרחשת רק לאחר הוספת תו חוקי, וכל שלב מדפיס את המחרוזת לפני הרקורסיה כדי לכסות גם מחרוזות קצרות.
תנאי דילוג (למניעת כפילויות):
אם
sorted[i] == sorted[i-1] וגם !used[i-1], אז בחירת sorted[i] תניב בדיוק את אותה תוצאה כמו בחירת sorted[i-1] — לכן נדלג.מימוש:
מעקב על `"SAAB"` (לאחר מיון: `"AABS"`):
depth | i | תו נבחר | current מודפס |
|---|---|---|---|
| 0 | 0 | A | A |
| 1 | 1 | A | AA |
| 2 | 2 | B | AAB → AABS |
| 2 | 3 | S | AAS → AASB |
| 1 | 2 | B | AB → ABA, ABAS, ABS, ABSA |
| 1 | 3 | S | AS → ASA, ASAB, ASB, ASBA |
| 0 | 1 | — | דילוג (A=A, used[0]=0) |
| 0 | 2 | B | B, BA, BAA, BAAS, BAS, BASA, BS, … |
| 0 | 3 | S | S, SA, SAA, SAAB, … |
הפלט מתחיל בדיוק כנדרש:
A, AA, AAB, AABS, AAS, AASB, AB, ABA, …נכונות backtracking: לא מתבצעת רקורסיה מיותרת — הקריאה הרקורסיבית מתרחשת רק לאחר הוספת תו חוקי, וכל שלב מדפיס את המחרוזת לפני הרקורסיה כדי לכסות גם מחרוזות קצרות.