作為實(shí)踐闺阱,請(qǐng)編寫程序完成下列任務(wù)盛正。
3.11.1 Collatz序列
編寫一個(gè)名為collatz()的函數(shù)隧熙,它有一個(gè)名為number的參數(shù)灶似。如果參數(shù)是偶數(shù),那么collatz()就打印出number // 2模庐,并返回該值烛愧。如果number是奇數(shù),collatz()就打印并返回3 * number+1。
提示:如果number% 2 == 0屑彻,整數(shù)number就是偶數(shù),如果number% 2 == 1顶吮,它就是奇數(shù)社牲。
然后編寫一個(gè)程序,讓用戶輸入一個(gè)整數(shù)悴了,并不斷對(duì)這個(gè)數(shù)調(diào)用collatz()搏恤,直到函數(shù)返回值1(令人驚奇的是,這個(gè)序列對(duì)于任何整數(shù)都有效湃交,利用這個(gè)序列熟空,你遲早會(huì)得到1!既使數(shù)學(xué)家也不能確定為什么搞莺。你的程序在研究所謂的“Collatz序列”息罗,它有時(shí)候被稱為“最簡單的、不可能的數(shù)學(xué)問題”)才沧。
記得將input()的返回值用int()函數(shù)轉(zhuǎn)成一個(gè)整數(shù)迈喉,否則它會(huì)是一個(gè)字符串。
3.11.2 輸入驗(yàn)證
在前面的項(xiàng)目中添加try和except語句温圆,檢測(cè)用戶是否輸入了一個(gè)非整數(shù)的字符串挨摸。正常情況下,int()函數(shù)在傳入一個(gè)非整數(shù)字符串時(shí)岁歉,會(huì)產(chǎn)生ValueError錯(cuò)誤得运,比如int(' puppy' )。在except子句中锅移,向用戶輸出一條信息熔掺,告訴他們必須輸入一個(gè)整數(shù)。
程序如下:
def collatz(number):? #定義collatz()的函數(shù)非剃,它有一個(gè)名為number的參數(shù)
? ? global i? #定義i為全局變量
? ? if number% 2 == 0:? #判斷number是不是偶數(shù)
? ? ? i=number//2
? ? ? print(i)
? ? else:
? ? ? i=3 * number+1
? ? ? print(i)
try:? #一直不知道try應(yīng)該加在哪里瞬女,直到看到輸入驗(yàn)證里的說明,我才知道是這里產(chǎn)生錯(cuò)誤努潘,以后應(yīng)直接在交互式環(huán)境中輸入表達(dá)式來驗(yàn)證是哪一句出現(xiàn)錯(cuò)誤诽偷。
? ? collatz(int(input()))? #輸入一下整數(shù),如果輸入的不是整數(shù)疯坤,就會(huì)報(bào)錯(cuò)报慕。
#i=collatz(input())? #一開始是想法返回值賦值給i然后通過i進(jìn)行接下去的判定的
#if i!=1:? #一開始使用的是if語句,后來發(fā)現(xiàn)if不能循環(huán)压怠,還需要加一個(gè)循環(huán)語句
#? ? collatz(i)
#else:
#? ? print('OK')
? ? while i!=1:? #直接使用用while語句進(jìn)行循環(huán)判定
? ? ? collatz(i)? #循環(huán)調(diào)用collatz()函數(shù)
except ValueError:? #輸入的不是整數(shù)眠冈,就直接跳到這里
? ? print('請(qǐng)輸入整數(shù)')
以上程序經(jīng)過驗(yàn)證,完全正確運(yùn)行。
重要的概念:
奇偶判斷
如果number% 2 == 0蜗顽,整數(shù)number就是偶數(shù)布卡,如果number% 2 == 1,它就是奇數(shù)雇盖。