3.Some Simple Numerical Programs

SimpleAlgorithm
SimpleAlgorithm

1.Exhaustive Enumeration-the while loop

Whenever you write a loop, you should think about an appropriate decrementing function. This is a function that has the following properties:

  1. It maps a set of program variables into an integer.
  2. When the loop is entered, its value is nonnegative.
  3. When its value is ≤ 0, the loop terminates.
  4. Its value is decreased every time through the loop.

What is the decrementing function for the while loop in Figure 3.1? It is abs(x) - ans**3

Some proper&es of itera&on loops:

  • need to set an itera&on variable outside the loop
  • need to test that variable to determine when done
  • need to change that variable within the loop, in addi&on to other work

Loop characteristics

  • Need a loop variable
    • Initialized outside loop
    • Changes within loop
    • Test for termina0on depends on variable

Now, add the statement:

print('Value of the decrementing function abs(x) - ans**3 is',
abs(x) - ans**3)
# then try for fun finding the cube root of 1957816251. The program will finish almost instantaneously. Now, try 7406961012236344616.

Experienced programmers often insert print statements, such as the one here, to test whether the decrementing function is indeed being decremented.

The algorithmic technique used in this program is a variant of guess and check called exhaustive enumeration. We enumerate all possibilities until we get to the right answer or exhaust the space of possibilities. At first blush, this may seem like an incredibly stupid way to solve a problem. Surprisingly, however, exhaustive enumeration algorithms are often the most practical way to solve a problem. They are typically easy to implement and easy to understand. And, in many cases, they run fast enough for all practical purposes.

考虑所有的条件,< = > != Compare,Iterate时候,不要将所要的结果排除在外!

print('Find the cube root of a perfect cube.')
x = int(input('Enter an integer: '))
ans = 0
while ans**3 <= abs(x): #因为有‘=’这个符号,所以无论选择什么数值,都会输出
    ans = ans + 1       # 'is not a perfect cube.') 因为在‘=’的情况下,
                        # 又循环递增了一次。
if ans**3 != abs(x):
    print(str(x), 'is not a perfect cube.')
else:
    ans = -ans
    print('Cube root of', str(x), 'is', str(ans))

报错:
无论输入什么数字,总是 '* is not a perfect cube.'

Formatted的应用,StackOverflow里的暖心解答

The Hard Way to Learn Python的第八节讲到formatted

print('Find the cube root of a perfect cube.')
x = int(input('Enter an integer: '))
ans = 0
while ans**3 < abs(x):  # This is a very intersting question.
    ans = ans + 1
if ans**3 != abs(x):
    print(x, 'is not a perfect cube.')
else:
    ans = -ans
    print('Cube root of %s is %s') % (str(x), str(ans))  # 直觉解答:%只能穿过一堵墙,%穿过’‘这堵墙,不能继续穿过第二堵墙。

报错:
 Traceback (most recent call last):
  File "3.SimpleAlgorithmeric.py", line 10, in <module>
    print('Cube root of %s is %s') % (str(x), str(ans))
TypeError: unsupported operand type(s) for %: 'NoneType' and 'tuple'

理论解答:You are calling the % outside of the print() function. This tries to see if the actual function print can be printed as %r, and because print doesn't return anything, it tries to get %rfor the value None (hence the NoneType error). Change it to

2 For Loops

The while loops we have used so far are highly stylized. Each iterates over a sequence of integers.

Python provides a language mechanism, the for loop, that can be used to simplify programs containing this kind of iteration.

print('Nested for loop')
x = 4
for j in range(x):
    print('the outer loop j', j)
    print('the outer loop x', x)
    for i in range(x):
        print('the inner loop x1: ', x)
        print('the inner loop i: ', i)
        x = 2
print('the inner loop x2', x)
the outer loop j 0 #
the outer loop x 4 # 最外层的X只循环一次,内层的X不断赋值改变。
the inner loop x1:  4
the inner loop i:  0--
the inner loop x1:  2
the inner loop i:  1--
the inner loop x1:  2
the inner loop i:  2--
the inner loop x1:  2
the inner loop i:  3--
the outer loop j 1------------
the outer loop x 2
the inner loop x1:  2
the inner loop i:  0
the inner loop x1:  2
the inner loop i:  1
the outer loop j 2-----------
the outer loop x 2
the inner loop x1:  2
the inner loop i:  0
the inner loop x1:  2
the inner loop i:  1
the outer loop j 3------------
the outer loop x 2
the inner loop x1:  2
the inner loop i:  0
the inner loop x1:  2
the inner loop i:  1
the inner loop x2 2

It raises the question of whether changing the value of x inside the loop affects the number of iterations. It does not. The arguments to the range function in the line with for are evaluated just before the first iteration of the loop, and not reevaluated for subsequent iterations.

加和数数:**

print('Number Counting')
total = 0
for c in range(101): #注意是100+1
    total = total + c
print(total)
输出:
Number Counting
5050

Print()函数分析:

print('求立方根,方程式ans**3 = x')
x = int(input('Enter an integer: '))
for ans in range(abs(x)+1):
    if ans**3 >= abs(x):
        break
if ans**3 > abs(x):
    print('%s is not a perfect cube.' %x)
else:
    if x < 0:
        ans = -ans
    print('Cube root of %s is %s' %(x, ans))
print('2Cube root of %s is %s' %(x, ans))
## 与 for, if, else, 平行的print输出的是整体的结果。

练习题

for letter in greeting:
    # count += 1
    if count % 2 == 0:
        print(letter)
    print(letter)
print('done')
只有多做练习题,才能体验到编程的乐趣,#因为可以不断地测试。

3 Approximate Solutions and Bisection Search

print('Approximate Solution and Bisection Search')
x = float(input('Enter an integer: '))
epsilon = 0.01
step = epsilon**2
numberGuesses = 0
ans = 0
while abs(ans**2 - x) >= 2 and ans <= x:
    ans += step
    numberGuesses += 1
print('numberGuesses = ', numberGuesses)
if abs(ans**2 - x) >= 2:
    print(ans)
else:
    print('%s is close to square root of %s' %(ans, x))
print('Using bisection search to approximate square root.')
x = float(input('Please enter a number: '))
epsilon = 0.01**5
numberGuesses = 0
low = 0
high = max(1, x)
ans = (high+low)/2
while abs(ans**2 - x) >= epsilon:
    print("low = %r, high = %r, ans = %r" %(low, high, ans))
    numberGuesses += 1
    if ans**2 < x:
        low = ans
    else:
        high = ans
    ans = (high + low)/2 #这是核心的公式。
    print('numberGuesses = %s' %numberGuesses)
print('Final-numberGuesses = %s' %numberGuesses)
print('%r is close to square root of %r' %(ans, x))

4 A Few Words About Using Floats

print('A Few Words About Using Floats')
x = 0
for i in range(10):
    x = x + 0.1
if x == 1.0:
    print(x, '=1.0')
else:
    print(x, 'is not 1.o')
    print x == 10 * 0.

5 Newton-Raphson

Newton proved a theorem that implies that if a value, call it guess, is an approximation to a root of a polynomial, then guess – p(guess)/p’(guess), where p’ is the first derivative of p, is a better approximation.

print('Newton-Raphson for square root.')
k = float(input('Enter a number: '))
guess = k/2
epsilon = 0.01
numerGuess = 0
while abs(guess**2 - k) >= epsilon:
    guess = guess - (((guess**2) - k)/(2*guess))
    numerGuess += 1

print('numerGuess=', numerGuess)
print('Square root of %r is about %r.' %(k, guess))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,355评论 0 23
  • “鼻子端正,微笑时自然流露的浅浅酒窝像个女孩子般文静乖巧,最吸引人的是那一双眼,那是怎样的一双眼啊,眼尾微微泛红上...
    笑靥1994阅读 307评论 0 0
  • 《雪落 - 人不复》 运城职业技术学院 张慧国 一年,枫叶落了,人也散了。 许多事情,总是在经历过后才懂得。 一如...
    陈侠女阅读 283评论 0 8
  • 这是任正非说的 这是猫友格总发给我的 我完全是不知所措一脸懵逼的 然后超级开心 这句话他丫的是真理呀 我想进步,以...
    猫良猫良阅读 759评论 6 9
  • 有人自称是脂砚斋的后人,知道《红楼梦》的作者是谁,而且他还知道书里写的是谁家的故事,《红楼梦》问世200多...
    懒云斋阅读 1,441评论 0 1