# SICP with Python / chap1.py

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103``` ```#!/usr/local/bin/python # -*- coding: utf-8 -*- print(''' Exercise 1.5 ============''') def p(): p() def test(x, y): if x == 0: return 0 else: return y print(test(0, p)) print(''' 1.1.7 Example: Square Roots by Newton's Method ==============================================''') def average(x, y): return (x + y) / 2 def improve(guess, x): return average(guess, x / guess) def square(x): return x * x def good_enough(guess, x): return abs(square(guess) - x) < 0.001 def sqrt_iter(guess, x): if good_enough(guess, x): return guess else: return sqrt_iter(improve(guess, x), x) def sqrt(x): return sqrt_iter(1.0, x) def _test(): print(sqrt(9)) print(sqrt(100 + 37)) print(sqrt(sqrt(2) + sqrt(3))) print(square(sqrt(1000))) _test() print(''' Exercise 1.7 ============''') print(''' good_enough(10**10, 10**10 + 1) expect: True, actual: {0}'''.format(good_enough(10**10, 10**10 + 1))) print(''' good_enough(0.00001, 0.0001) expect: False, actual: {0}'''.format(good_enough(0.0001, 0.0009))) print('re-define "good_enough" to show calculation process') def good_enough(guess, x): print('guess: {0}'.format(guess)) return abs(square(guess) - x) < 0.001 print(''' sqrt(10**10) (obviously is 10**5) ---------------------------------''') print('actual: {0}'.format(sqrt(10**10))) print(''' sqrt(0.0001) (obviously is 0.01) ----------------------------------''') print('actual: {0}'.format(sqrt(0.0001))) print(''' refining good_enough function... def good_enough(guess, x): print('guess: {0}'.format(guess)) return abs(square(guess) / x - 1) < 0.001''') print('re-run') def good_enough(guess, x): print('guess2: {0}'.format(guess)) return abs((square(guess) / x) - 1) < 0.001 print(''' sqrt(10**10) (obviously is 10**5) ---------------------------------''') print('actual: {0}'.format(sqrt(10**10))) print(''' sqrt(0.0001) (obviously is 0.01) ----------------------------------''') print('actual: {0}'.format(sqrt(0.0001))) ```