שאלת מבחן במבוא למדעי המחשב - הטכניון 2020 - רקורסיה

שאלה 4 (25 נקודות):

נתונה מחרוזת str שמכילה אותיות אנגלית גדולות בלבד. ממשו פונקציה שמדפיסה פעם אחת כל מחרוזת שניתן להרכיב מהתווים של המחרוזת הנתונה בסדר למילוני (לקסיקוגרפי).



דוגמה:
בהינתן מחרוזת "SAAB", הפונקציה תוציא את הפלט הבא (רק 16 מילים ראשונות מופעיות):


A
AA

AAB

AABS

AAS

AASB

AB

ABA

ABAS

ABS

ABSA

AS

ASA

ASAB

ASB

ASBA


הערות:
• יש להשתמש בשיטת backtracking כפי שנלמדה בכיתה.

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

• ניתן ומומלץ להשתמש בפונקציות עזר (ויש לממש את כולן).


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

תנאי דילוג (למניעת כפילויות):
אם sorted[i] == sorted[i-1] וגם !used[i-1], אז בחירת sorted[i] תניב בדיוק את אותה תוצאה כמו בחירת sorted[i-1] — לכן נדלג.


מימוש:



מעקב על `"SAAB"` (לאחר מיון: `"AABS"`):

depthiתו נבחרcurrent מודפס
00AA
11AAA
22BAABAABS
23SAASAASB
12BABABA, ABAS, ABS, ABSA
13SASASA, ASAB, ASB, ASBA
01דילוג (A=A, used[0]=0)
02BB, BA, BAA, BAAS, BAS, BASA, BS, …
03SS, SA, SAA, SAAB, …


הפלט מתחיל בדיוק כנדרש: A, AA, AAB, AABS, AAS, AASB, AB, ABA, …

נכונות backtracking: לא מתבצעת רקורסיה מיותרת — הקריאה הרקורסיבית מתרחשת רק לאחר הוספת תו חוקי, וכל שלב מדפיס את המחרוזת לפני הרקורסיה כדי לכסות גם מחרוזות קצרות.
שאלת מבחן במבוא למדעי המחשב - הטכניון 2020 | prepd