תרגיל בית מספר 1#

‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪3102‬‬
‫תרגיל בית מספר ‪ - 2‬להגשה עד ‪ 8‬באפריל בשעה ‪225::‬‬
‫קיראו בעיון את הנחיות העבודה וההגשה המופיעות באתר הקורס‪ ,‬תחת‬
‫התיקיה ‪ .assignments‬חריגה מההנחיות תגרור ירידת ציון ‪ /‬פסילת התרגיל‪.‬‬
‫הנחיות ספציפיות לתרגיל זה‪:‬‬
‫‪‬‬
‫תשובות לשאלות ‪ 1‬ג'‪ 4 ,3 ,‬א' ו‪ 4 -‬ב' יש לממש בקובץ השלד (‪ )skeleton.py‬המצורף לתרגיל זה‪ .‬אין לצרף‬
‫לקובץ ה‪ py -‬את הקוד ששימש לפתרון יתר השאלות‪ .‬לא לשכוח לשנות את שם הקובץ למספר ת"ז שלכם‬
‫לפני ההגשה‪ ,‬אך להשאיר את הסיומת ‪.py‬‬
‫שימו לב שבקובץ השלד יש פונקציה בשם ‪ test‬המכילה כמה מקרים פשוטים‪ .‬היעזרו בפונקציה זו כדי לוודא‬
‫נכונות הפלטים שלכם עבור אותם מקרים‪ .‬פתרונות שלא עובדים נכון במקרים פשוטים אלו לא יתקבלו‪.‬‬
‫כמובן‪ ,‬על הקוד שלכם להיות נכון לכל קלט תקין‪ ,‬ולא רק למקרים שבדוגמאות‪.‬‬
‫‪‬‬
‫כל שאר השאלות יוגשו בקובץ ‪ docx ,doc‬או ‪ pdf‬יחיד‪.‬‬
‫‪‬‬
‫בסה"כ מגישים שני קבצים בלבד‪ .‬עבור סטודנט שמספר ת"ז שלו הוא ‪ 012345678‬הקבצים שיש‬
‫להגיש הם ‪( 012345678.docx‬או ‪ .doc‬או ‪ ).pdf‬ו‪.012345678.py -‬‬
‫‪‬‬
‫הקפידו לענות על כל מה שנשאלתם‪ ,‬באופן קולע וברור‪.‬‬
‫עמ' ‪ 1‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪3102‬‬
‫שאלה ‪1‬‬
‫אלגוריתם שמבצע את פעולתו במקום (‪ )in-place algorithm‬הוא אלגוריתם שמעתיק בכל רגע נתון רק‬
‫כמות קבועה מהקלט שלו למשתני עזר (ב"כמות קבועה" הכוונה לכמות שאיננה תלויה כלל בגודל הקלט)‪.‬‬
‫בפרט‪ ,‬אלגוריתם כזה לא מייצר העתק של הקלט שלו‪ ,‬אלא משנה אותו במידת הצורך‪.‬‬
‫נבחן בהקשר זה את פעולת היפוך סדר האיברים של רשימה נתונה בשם ‪.lst‬‬
‫א‪ .‬האם הפקודה ]‪ lst = lst[ : :-1‬הופכת את סדר האיברים במקום? הסבירו בקצרה את תשובתכם‪.‬‬
‫ב‪ .‬האם הפקודה )(‪( lst.reverse‬המתודה ‪ reverse‬של המחלקה ‪ )list‬הופכת את סדר האיברים במקום? מה‬
‫מחזירה הפונקציה? הסבירו בקצרה את תשובתכם‪.‬‬
‫טיפ‪ :‬כדי לענות על סעיפים א' ו‪ -‬ב' כדאי להשתמש בפונקציה ‪ id‬של פייתון‪.‬‬
‫ג‪ .‬הוסיפו לקובץ השלד המצורף מימוש לפונקציה )‪ reverse(lst‬שמקבלת רשימה‪ ,‬והופכת את סדר‬
‫האיברים שלה‪ ,‬במקום‪ .‬הפונקציה תחזיר ‪ .None‬אין להשתמש בפונקציות מוכנות של פייתון‪ ,‬אלא יש‬
‫לבצע את היפוך הסדר באופן ישיר‪.‬‬
‫דוגמת הרצה‪:‬‬
‫]‪>>> lst = [1,2,3‬‬
‫)‪>>> reverse(lst‬‬
‫‪>>> lst‬‬
‫]‪[3,2,1‬‬
‫ד‪ .‬האם ניתן לכתוב פונקציה כזו גם עבור היפוך סדר התווים במחרוזת במקום? הסבירו מה יהיו‬
‫ההבדלים מן הפונקציה שכתבתם בסעיף ג' (אם בכלל)‪ ,‬או הסבירו מדוע אי אפשר‪.‬‬
‫עמ' ‪ 2‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪3102‬‬
‫שאלה ‪2‬‬
‫שלישיית מספרים טבעיים ‪ a < b < c‬נקראת שלשה פיתגורית אם היא מקיימת את משפט פיתגורס‪:‬‬
‫‪.a2 + b2 = c2‬‬
‫דוגמה‪.32 + 42 = 52 :‬‬
‫א‪ .‬מיצאו את כל השלשות הפיתגוריות שמקיימות ‪.a + b + c = 1960‬‬
‫ב‪ .‬מיצאו לכמה מספרים ‪ 0 ≤ m < 1000‬מתקיים התנאי הבא‪:‬‬
‫קיימת בדיוק שלשה פיתגורית אחת עבורה ‪.a + b + c = m‬‬
‫ג‪ .‬בונוס‪ :‬מיצאו את כל השלשות הפיתגוריות שמקיימות ‪.a + b + c = 30000000 = 3*107‬‬
‫הערה‪ :‬אין בתרגיל זה מגבלה ספציפית על זמן הריצה של התוכנית שלכם‪ ,‬אבל בכל זאת כדאי להשקיע מחשבה‬
‫על היעילות של הקוד שלכם בטרם תפתרו את סעיף ב' ‪ -‬פתרון לא יעיל עלול לרוץ זמן רב מדיי (ולא להסתיים‬
‫לפני מועד הגשת התרגיל‪ .)...‬בסעיף ג' צריך להשקיע אף יותר מחשבה בעניין‪.‬‬
‫הערה נוספת‪ :‬אל תשתמשו בתכונות של שלשות פיתגוריות שאינכם יודעים להוכיח‪.‬‬
‫שאלה ‪2‬‬
‫זוהי שאלת המשך לשאלה ‪ 5‬מתרגיל בית ‪.1‬‬
‫בשאלה ההיא נתבקשתם למצוא ‪ 12‬ספרות סמוכות שסכומן מקסימלי במספר נתון‪ .‬לא נדרשתם לתת‬
‫דעתכם לעניין היעילות של התוכנית שלכם‪.‬‬
‫כעת‪ ,‬ברצוננו למצוא סכום מקסימלי של ‪ 60,000‬ספרות סמוכות במספר ‪.5200,000‬‬
‫נסו לפתור את הבעייה הזו תחילה עם הקוד שכתבתם בתרגיל בית ‪ .1‬ייתכן שהקוד שלכם היה יעיל מספיק‪.‬‬
‫אך אם הריצה לא מסתיימת תוך לכל היותר דקה אחת על מחשב סביר (למשל המחשבים בחוות המחשבים‬
‫בבניין שרייבר)‪ ,‬תצטרכו לייעל את התוכנית שלכם‪ .‬נסו לחשוב איפה יש נקודות של חוסר יעילות מבחינת‬
‫זמן ריצה‪.‬‬
‫הנחיות הגשה‪ :‬את התשובה המספרית לשאלה (הסכום המקסימלי הנ"ל) הגישו בקובץ ה‪.doc/docx/pdf -‬‬
‫בקובץ השלד ממשו את הקוד המשופר שלכם‪ ,‬אבל הפעם כפונקציה‪ ,‬ולא כתוכנית כמו בתרגיל בית ‪ .1‬שם‬
‫הפונקציה יהיה )‪ ,sum_digits(n, d‬והיא תחזיר את הסכום המקסימלי של ‪ d‬ספרות סמוכות במספר ‪.n‬‬
‫דוגמת הרצה‪:‬‬
‫)‪>>> sum_digits(5**36, 12‬‬
‫‪16‬‬
‫עמ' ‪ 3‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪3102‬‬
‫שאלה ‪4‬‬
‫א‪ .‬כיתבו פונקציה )‪ add(A, B‬שמקבלת שתי מחרוזות המייצגות מספרים טבעיים בכתיב בינארי‪,‬‬
‫ומחזירה מחרוזת שמייצגת את החיבור שלהם‪.‬‬
‫דוגמת הרצה‪:‬‬
‫)"‪>>> add("1111", "11010‬‬
‫'‪'101001‬‬
‫להלן המחשה של אלגוריתם החיבור ‪( A+B‬בדומה לחיבור מספרים עשרוניים עם נשא (‪:))carry‬‬
‫)‪(carried digits‬‬
‫‪1 1 1 1‬‬
‫)‪1 1 1 1 (A‬‬
‫‪+‬‬
‫)‪1 1 0 1 0 (B‬‬
‫‪------------‬‬‫‪= 1 0 1 0 0 1‬‬
‫ב‪ .‬כיתבו פונקציה )‪ mult(A, B‬שמקבלת שתי מחרוזות המייצגות מספרים טבעיים בכתיב בינארי‪,‬‬
‫ומחזירה מחרוזת שמייצגת את המכפלה שלהם‪.‬‬
‫דוגמת הרצה‪:‬‬
‫)"‪>>> mult("110", "11‬‬
‫'‪'10010‬‬
‫להלן המחשה של אלגוריתם ההכפלה ‪( AxB‬בדומה למכפלת מספרים עשרוניים)‪:‬‬
‫)‪(A‬‬
‫)‪(B‬‬
‫‪← Corresponds to a zero in B‬‬
‫‪← Corresponds to a one in B‬‬
‫‪1 0 1‬‬
‫‪× 1 0 1 0‬‬
‫‪--------‬‬‫‪0 0 0‬‬
‫‪+‬‬
‫‪1 0 1‬‬
‫‪+‬‬
‫‪0 0 0‬‬
‫‪+‬‬
‫‪1 0 1‬‬
‫‪--------------‬‬‫=‬
‫‪1 1 0 0 1 0‬‬
‫הנחייה‪ :‬בסעיפים א' ו‪ -‬ב' אין להשתמש בהמרות של מספרים מבסיס לבסיס‪ .‬בפרט‪ ,‬אין להשתמש‬
‫בפונקציות ‪ int‬ו‪ bin -‬של פייתון‪ ,‬בפונקציה ‪ convert_base‬שראינו בתרגול וכו'‪ .‬יש לממש את‬
‫האלגוריתמים בהתאם להמחשות שהובאו‪ ,‬ישירות באמצעות לולאות‪.‬‬
‫ג‪ .‬נניח שכל פעולת חיבור או כפל של שני ביטים לוקחת יחידת זמן אחת‪ .‬נסמן את מספר הביטים של ‪ A‬ב‪-‬‬
‫‪ n‬ושל ‪ B‬ב‪.m -‬‬
‫מהי סיבוכיות הזמן של הפונקציה ‪ add‬ושל הפונקציה ‪ mult‬כתלות ב‪ n -‬ו‪ ?m -‬התייחסו למקרה הגרוע‬
‫(כלומר ל‪ A -‬ו‪ B -‬כנ"ל עבורם יתבצע מספר מקסימלי של פעולות חיבור‪/‬כפל של שני ביטים)‪ .‬תנו‬
‫תשובתכם כביטוי סדר גודל אסימפטוטי (כלומר ע"י שימוש בסימון )…(‪.) O‬‬
‫עמ' ‪ 4‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪3102‬‬
‫שאלה ‪:‬‬
‫בהינתן טבעי ‪ ,n‬כל טבעי ‪ k‬שקטן ממש מ‪ n-‬ומחלק את ‪ n‬נקרא מחלק ממש של ‪.n‬‬
‫סדרת מחלקים היא סדרת מספרים‪ ,‬שהראשון שבהם הוא מספר טבעי כלשהו‪ ,‬וכל איבר שווה לסכום‬
‫המחלקים ממש של קודמו בסדרה‪ .‬אם מגיעים ל‪ – 0 -‬הסדרה מסתיימת (שכן ל‪ 0 -‬אין מחלקים)‪.‬‬
‫למשל‪ ,‬להלן סדרת מחלקים שמתחילה ב‪:45 -‬‬
‫סדרות מחלקים נחלקות ל‪ 3 -‬סוגים‪:‬‬
‫‪ .1‬סדרות שמסתיימות ב‪( 0 -‬סדרות סופיות)‪.‬‬
‫‪ .2‬סדרות שלא מגיעות ל‪ 0 -‬לעולם (אינסופיות)‪ ,‬שנכנסות למעגל מחזורי כלשהו‪.‬‬
‫‪ .3‬סדרות שלא מגיעות ל‪ 0 -‬לעולם (אינסופיות)‪ ,‬שלא נכנסות למעגל מחזורי כלשהו (סדרות כאלו‬
‫חייבות להיות בלתי חסומות)‪.‬‬
‫ישנן סדרות שלא ידוע לאיזה סוג הן שייכות‪ .‬למעשה לא ידוע אם בכלל יש סדרות מהסוג השלישי –‬
‫זוהי שאלה פתוחה במתמטיקה‪.‬‬
‫א‪ .‬הסבירו בקצרה מדוע יש אינסוף סדרות מהסוג הראשון (רמז‪ :‬מספרים ראשוניים)‪ ,‬ומדוע יש סדרות‬
‫מהסוג השני (רמז‪ :‬מספרים מושלמים)‪.‬‬
‫ב‪ .‬כמה מספרים בין ‪ 1‬ל‪ 275 -‬הם התחלה של סדרות מהסוג הראשון? ומהסוג השני? (כל המספרים בתחום‬
‫זה מתחילים סדרה ששייכת לאחד משני הסוגים הללו‪ .‬לגבי ‪ 272‬אגב‪ ,‬לא ידוע כיום לאיזה סוג הוא‬
‫שייך‪.)...‬‬
‫ג‪ .‬כמה מספרים בסדרה שמתחילה ב‪ 107 -‬מתחלקים ב‪ 10 -‬ללא שארית?‬
‫למשל‪ ,‬עבור ‪ 45‬יש מספר אחד כזה (שהוא ‪.)0‬‬
‫לצורך עזרה בבדיקת תקינות‪ :‬בסדרה שמתחילה ב‪ 131 -‬יש ‪ 30‬מספרים כאלו‪.‬‬
‫סוף‪.‬‬
‫עמ' ‪ 5‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬