תכנות - שיעור 18 30/October/2005    

מעתה, מי שמגיש תרגילים מקבל שוקולד ממי שלא הגיש.

פתרונות לתרגילים קודמים

תוכלו לראות פתרונות של תרגיל הפיכת שורות ושל תרגיל הפיכה ושקוף שנתנו בשעור 15 . בנוסף תרגילים של פרמטרים משורת הפקודה, מספר גדול ביותר ושל מחלק משותף גדול ביותר שנתנו בשעור 16 .

הוצאת שרש רבועי

התחלנו לדון בבעיה של הוצאת שרש רבועי של מספר חיובי. נניח ש-

lteq1.png
ואנחנו רוצים למצא פתרון חיובי למשואה:
lteq2.png

כלומר, עלינו לחשב את
lteq3.png

לעת עתה, "חוקי המשחק" שלנו הם שמותר לנו להשתמש ב-Python רק בארבעת פעולות החשבון (חבור, חסור, כפל וחלוק), וכן בפעולות ההשואה:

==      <=       >=

לא תמיד אפשר להגיע במדויק לשרש בעזרת הפעולות האלה. לכן אנו "נסתפק" בכך שנתקרב אליו ככל האפשר.

קירובים לשרש

נניח ש lteq4.png ואז גם
lteq5.png
ועכשיו אנו במצב:
lteq6.png
כאשר
m = 1
M = a
כלומר x נמצא בין m לבין M. ננסה צעד צעד, או להקטין את M, או להגדיל את m. נעשה זאת על ידי חישוב הממוצע
lteq7.png
ובדיקה אם lteq8.png או lteq9.png


תרגילים

  1. כתוב תכנית שמקבלת שלושה מספרים בשורת הפקודה ומוצאת את המחלק המשותף (gcd) של כלם.
    הערה: בכדי למצא gcd של שלושה מספרים lteq10.png מוצאים תחילה של שני מספרים, ואחר כך מוצאים gcd של התוצאה עם המספר השלישי. במלים אחרות:
    lteq11.png
  2. כתב תכנית שמקבלת שני מספרים: lteq12.png ומדפיסה lteq13.png קירובים של lteq14.png

  3. לדוגמא, אם
    lteq15.png

    אז התכנית תדפיס:
    Iteration[0] = 100.500000
    Iteration[1] = 50.750000
    Iteration[2] = 25.875000
    Iteration[3] = 13.437500
    Iteration[4] = 19.656250
    Iteration[5] = 16.546875
    Iteration[6] = 14.992188
    Iteration[7] = 14.214844
    Iteration[8] = 13.826172
    Iteration[9] = 14.020508
    Iteration[10] = 14.117676
    Iteration[11] = 14.166260
    Iteration[12] = 14.141968
    Iteration[13] = 14.154114
    Iteration[14] = 14.148041
    Iteration[15] = 14.145004
    Iteration[16] = 14.143486
    Iteration[17] = 14.142727
    Iteration[18] = 14.142347
    Iteration[19] = 14.142158
    

    הערה: בכדי להדפיס מספר "ממשי" (שאינו שלם) יש להשתמש ב- "%f". למשל הדוגמא למעלה נכתבה בעזרת:

    sys.stdout.write("Iteration[%d] = %f\n" % (i, x1))
    


חזרה לעמוד האם