אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,אביב 2014 תרגיל בית מספר - 2להגשה עד 20במרץ בשעה 23:55 קראו בעיון את הנחיות העבודה וההגשה המופיעות באתר הקורס ,תחת התיקייה .assignmentsחריגה מההנחיות תגרור ירידת ציון /פסילת התרגיל. הנחיות והערות ספציפיות לתרגיל זה: הגשה: • תשובות לשאלות מילוליות תוגשנה בקובץ pdfיחיד. • מימושים לפונקציות יש להוסיף לקובץ השלד ) (skeleton2.pyהמצורף לתרגיל זה .אין לצרף לקובץ ה pyאת הקוד ששימש לפתרון יתר השאלות. לא לשכוח לשנות את שם הקובץ למספר ת"ז שלכם לפני ההגשה ,עם סיומת .py • בסה"כ מגישים שני קבצים בלבד .עבור סטודנט שמספר ת"ז שלו הוא 012345678הקבצים שיש להגיש הם 012345678.pdfו.012345678.py - • הקפידו לענות על כל מה שנשאלתם. • בתרגיל זה ניתן להניח כי הקלט לפונקציות אותן תכתבו תקין ,כלומר אין צורך לבדוק את תקינותו. • תשובות מילוליות והסברים צריכים להיות תמציתיים ,קולעים וברורים. להנחיה זו מטרה כפולה: .1על מנת שנוכל לבדוק את התרגילים שלכם בזמן סביר. .2כדי להרגיל אתכם להבעת טיעונים באופן מתומצת ויעיל ,ללא פרטים חסרים מצד אחד אך ללא עודף בלתי הכרחי מצד שני .זוהי פרקטיקה חשובה במדעי המחשב. עמ' 1מתוך 7 CC BY-NC-SA 3.0 אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,אביב 2014 שאלה 1 אלגוריתם שמבצע את פעולתו בַּ מָּ קום ) (in-place algorithmהוא אלגוריתם שמעתיק לכל היותר כמות קבועה מהקלט שלו למשתני עזר )ב"כמות קבועה" הכוונה לכמות שאינה תלויה בגודל הקלט(. בפרט ,אלגוריתם כזה לא יוצר העתק של הקלט שלו ,אלא משנה אותו במידת הצורך. ראשית ,נבחן בהקשר זה את פעולת היפוך סדר באיברים של רשימה נתונה בשם .lst א. ב. ג. ד. האם הפקודה ] lst = lst[ : :-1הופכת את סדר האיברים במקום? הסבירו בקצרה את תשובתכם. האם הפקודה )() lst.reverseהמתודה reverseשל המחלקה (listהופכת את סדר האיברים במקום? מה מחזירה הפונקציה? הסבירו בקצרה את תשובתכם. האם ניתן לכתוב פונקצית reverseבמקום עבור מחרוזת? הסבירו. הוסיפו לקובץ השלד המצורף מימוש לפונקציה ) ,reverse_sublist(lst,start,endאשר מקבלת רשימה ושני אינדקסים ,והופכת במקום את סדר האיברים בחלק הרשימה שמתחיל באינדקס startונגמר באינדקס .end-1 לשם הפשטות ניתן להניח כי ).0<=start<end<=len(lst דוגמאות הרצה: ]>>> lst = [1, 2, 3, 4, 5 )>>> reverse_sublist (lst,0,4 >>> lst ][4, 3, 2, 1, 5 ]">>> lst = ["a","b )>>> reverse_sublist (lst,0,1 >>> lst ]"["a", "b כעת נדון בפעולת ה -kסיבוב של רשימה. בהנתן פרמטר ה - kסיבוב ,פעולת ה -kסיבוב על רשימה באורך mמוגדרת באופן הבא: הרשימה תסודר מחדש כך שאיבר שהופיע באינדקס iיועתק לאינדקס .(i+k)mod m לדוגמה, אם נבצע על הרשימה ]-1 [1,2,3,4,5סיבוב נקבל ][5,1,2,3,4 אם נבצע על הרשימה ]-2 [1,2,3,4,5סיבוב נקבל ][4,5,1,2,3 ואם נבצע על הרשימה ]-(-1) [1,2,3,4,5סיבוב נקבל ].[2,3,4,5,1 שימו לב שפעולת הסיבוב מעתיקה לתוך כל תא איבר יחיד .בנוסף ,הפרמטר kחייב להיות שלם, אבל יכול להיות שלילי )כמו בדוגמה האחרונה(. ה .הוסיפו לקובץ השלד מימוש לפונקציה ) ,rotate1(lstאשר מקבלת רשימה ומבצעת -1סיבוב של אבריה במקום. דוגמת הרצה: ]>>> lst = [1, 2, 3, 4, 5 )>>> rotate1 (lst >>> lst ][5, 1, 2, 3, 4 עמ' 2מתוך 7 CC BY-NC-SA 3.0 אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,אביב 2014 ו .הוסיפו לקובץ השלד מימוש לפונקציה ) ,rotatek_v1(lst,kאשר מקבלת רשימה ומבצעת סיבוב k-של אבריה במקום באמצעות קריאה לפונקציה )( .rotate1ניתן להניח ש kשלם. דוגמת הרצה: ]>>> lst = [1, 2, 3, 4, 5 )>>> rotatek_v1 (lst,2 >>> lst ][4, 5, 1, 2, 3 ז .הוסיפו לקובץ השלד מימוש לפונקציה ) ,rotatek_v2(list,kאשר מקבלת רשימה ומבצעת סיבוב k-של אבריה במקום באמצעות קריאה לפונקציה )(.reverse_sublist פלט לדוגמה :בדיוק כמו בסעיף הקודם ,בשינוי שם הפונקציה. )רמז :התבוננו ברשימה ][1,2,3,4,5 ובתוצאת הסיבוב 2-שלה ].[4,5,1,2,3 כיצד ניתן להפוך את הרשימה הראשונה לשנייה באמצעות פעולות היפוך עוקבות ?(. הנחיות הגשה: בקובץ ה pdfהגישו:• את התשובות לסעיפים א',ב',ג'. בקובץ ה pyהגישו:• את הפונקציות שמימשתם בסעיפים ד',ה',ו',ז'. עמ' 3מתוך 7 CC BY-NC-SA 3.0 אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,אביב 2014 שאלה 2 בשאלה זו נבצע פעולת חישוב על רשימה של מספרים .כיוון שרשימת המספרים עשויה להיות ארוכה מאד ,הכרחי לממש את הפעולה באופן יעיל. נגדיר סכום מתחלף ) (alternating sumשל סדרת מספרים 𝑎0 , 𝑎1 , … , 𝑎𝑛−1כתוצאת החישוב n .∑n−1 … 𝑖=0 (−1) 𝑎𝑖 = 𝑎0 − 𝑎1 + 𝑎2 − 𝑎3 א .מצאו במספר 5200,000סכום מתחלף מקסימלי של ) 50,000חמישים-אלף( ספרות עוקבות. שימו לב :אנו מגדירים את סדר הספרות במספר משמאל לימין ,ולכן בכל רצף עוקב הספרה השמאלית ביותר היא זו שתסומן כ 𝑎0ותפתח את הסכום בסימן חיובי. לדוגמה ,המספר 43805מכיל את הסכומים המתחלפים באורך 3הבאים: 4-3+8 3-8+0 8-0+5 על הריצה להסתיים תוך לכל היותר דקה אחת על מחשב סביר )למשל המחשבים בחוות המחשבים בבניין שרייבר(. בקובץ השלד ממשו את הקוד כפונקציה .שם הפונקציה יהיה ) altsum_digits(n, dוהיא תחזיר את הסכום המקסימלי של dספרות סמוכות במספר .n דוגמת הרצה: )>>> altsum_digits(5**36, 12 18 הדרכה: נסו לחשוב בתחילה כיצד הייתם מחפשים באופן יעיל את הסכום הרגיל )לא מתחלף( של d ספרות עוקבות .בפרט ,שימו לב שעל מנת שהתכנית תרוץ מספיק מהר ,לא ניתן לממש את הפתרון הטריוויאלי ,אשר סוכם בנפרד כל תת סדרה רציפה באורך .dחשבו איך בהינתן הסכום של dהספרות הראשונות ניתן לחשב ביעילות את הסכום של dהספרות אשר מתחילות בספרה השנייה בסדרה. ב .נסמן ב nmult, nminus, nplusאת מספר פעולות החיבור ,חיסור וכפל )בהתאמה( שהפונקציה שכתבתם בסעיף א' מבצעת בריצה נתונה. רשמו ביטויים מתמטיים )פשוטים( למספרים אלה כפונקציה של הפרמטרים nו .d ניתן להשמיט מהחישוב כל פעולה שבוצעה מספר קבוע של פעמים )כלומר שאינה נמצאת בתוך לולאה כלשהי(. הנחיות הגשה: בקובץ ה pdfהגישו:• את התשובה שחישבתם בסעיף א' • את התשובה לסעיף ב' בקובץ ה pyהגישו:• את הפונקציה שכתבתם כדי לענות על סעיף א' עמ' 4מתוך 7 CC BY-NC-SA 3.0 אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,אביב 2014 שאלה 3 מספר מושלם ) (perfect numberהינו מספר שלם חיובי ששווה לסכום המחלקים שלו ,כאשר לא כוללים בסכום את המספר עצמו )קבוצה זו נקראת גם קבוצת המחלקים-ממש של המספר(. לדוגמה ,המספר 6הוא מספר מושלם מכיוון שמתקיים. 6 = 3 + 2 + 1 : לעומת זאת ,המספר 4אינו מספר מושלם משום שמתקיים. 4 ≠ 2 + 1 : א .הוסיפו לקובץ השלד המצורף מימוש לפונקציה ) ,sum_divisors(nאשר מקבלת מספר שלם חיובי ,nומחזירה את סכום המחלקים-ממש שלו. דוגמת הרצה: )>>> sum_divisors(6 6 )>>> sum_divisors(4 3 הנחייה מחייבת :על הפונקציה לרוץ ב– )𝑛√(𝑂 .מימוש יעיל פחות יגרור זמן ריצה ארוך בסעיף ג' )בהמשך השאלה( ,ולכן יאבד נקודות. ב .הוסיפו לקובץ השלד המצורף מימוש לפונקציה ) ,is_perfect(nאשר מקבלת מספר שלם חיובי ,nומחזירה ערך בוליאני באופן הבא :אם המספר nהינו מספר מושלם הפונקציה תחזיר ,Trueאחרת תחזיר .False דוגמת הרצה: )>>> is_perfect(6 True )>>> is_perfect(4 False ג .נרצה לדעת כמה מספרים מושלמים שקטנים מ 100,000קיימים. הוסיפו לקובץ השלד המצורף מימוש לפונקציה ) ,count_perfect_numbers(limitאשר מקבלת מספר חיובי ,limitומחזירה כמה מספרים מושלמים קטנים או שווים ל .limit בנוסף ,את התוצאה שקיבלתם עבור limit = 100,000הוסיפו לקובץ ה . pdf הנחיות הגשה: בקובץ ה pdfהגישו:• את התשובה שחישבתם בסעיף ג' בקובץ ה pyהגישו:• את הפונקציות שכתבתם כדי לענות על סעיפים א',ב',ג' עמ' 5מתוך 7 CC BY-NC-SA 3.0 אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,אביב 2014 שאלה 4 בשאלה זו נעסוק בהיבטים שונים של ייצוג מספרים בבסיסים שונים. א .כמה ספרות יש למספר 51209בייצוג עשרוני ? ענו על השאלה באמצעות הנוסחה שראיתם בשיעור )שקף 33במצגת שיעור ,(4וגם באמצעות הפיכת המספר מ integer-ל ,string-ומדידת אורך המחרוזת באמצעות )(.len צרפו לקובץ ה pdfאת התשובה ,וכן שתי שורות קוד בודדות – אחת לכל אופן פתרון - שמבצעות את החישוב. הדרכה :מומלץ להשתמש בפונקציה ) log(x,baseשל המודול ,mathאשר מחשבת את הלוגריתם של xבבסיס .base ב .ממשו את הפונקציה ) ,add_hex(A, Bאשר מקבלת שתי מחרוזות המייצגות מספרים בייצוג הקסדצימלי )כלומר בבסיס ,(16ומחזירה את המחרוזת שמייצגת את תוצאת החיבור שלהם, גם היא בייצוג הקסדצימלי. ניתן להניח כי מחרוזות הקלט מייצגות מספרים חוקיים בבסיס ,16ולפיכך כוללות רק ספרות ואת האותיות ) a,b,c,d,e,fשימו לב :האותיות ניתנות ב .(lower case דוגמת הרצה: )">>> add("a5", "17 ''bc להלן המחשה של אלגוריתם החיבור A+Bעל מספרים בבסיס ) 16בדומה לחיבור מספרים עשרוניים עם נשא ):((carry )(carried digits 1 )1 f 5 (A + )5 a (B ------------= 2 4 f הנחיה: .1הטיפול בספרות ההקס דצימליות )חלקן ספרות "רגילות" וחלקן אותיות( לא יתבצע באמצעות סדרה של משפטי תנאי ,אלא באמצעות המרה מיידית ,בדומה למה שראיתם בתרגול .3 .2אין להמיר את המספרים Aאו Bמבסיס לבסיס .בפרט ,אין להשתמש כלל בפונקציה int של פייתון ,בפונקציה convert_baseשראינו בתרגול וכו' .יש לממש את האלגוריתם בהתאם להמחשה :ישירות באמצעות לולאות. עמ' 6מתוך 7 CC BY-NC-SA 3.0 אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,אביב 2014 ג .נתבונן שוב בקוד אשר הובא בהרצאה להעלאה בחזקה באמצעות :iterated squaring def power(a,b): """"""computes a**b using iterated squaring result = 1 while b>0: if b%2 == 1: # b is odd result = result*a a = a*a # squares power of a b = b//2 # removes least significant bit of b return result נרצה להבין את הקשר בין מספר הפעולות שמבצע האלגוריתם לבין המספרים aו .b לשם כך ,הוסיפו בתוך הפונקציה )אך מבלי לשנות את הקוד הקיים( שורות אשר תספורנה (1כמה פעמים בוצעה לולאת ה ) whileנסמן ב (n1 (2כמה פעמים התקיים התנאי ב ) ifנסמן ב (n2 (3כמה פעולות כפל ביצעה הפונקציה )נסמן ב (n3 הריצו את הפונקציה עבור הקלטים a=3, b=2**10 a=3, b=2**10-1 a=30, b=2**10 a=30, b=2**10-1 ורשמו בקובץ ה pdfאת n1,n2,n3עבור כל אחת מההרצות. בנוסף ,רשמו ביטוי מתמטי מפורש עבור n1, n2, n3כפונקציה של =kמספר הביטים בייצוג הבינארי של b ו =mמספר ה 1-בייצוג הבינארי של .b כדאי כמובן לבדוק את הביטויים שלכם על הדוגמאות שלעיל. הנחיות הגשה: בקובץ ה pdfהגישו:• את התשובה שחישבתם בסעיף א' ,ואת שורות הקוד ששימשו אתכם בחישוב • את תשובתכם לסעיף ג' בקובץ ה pyהגישו:• את הפונקציה שמימשתם בסעיף ב' סוף. עמ' 7מתוך 7 CC BY-NC-SA 3.0
© Copyright 2024