編寫一個名為collatz()的函數,它有一個名為number的參數:
如果參數是偶數,那么collatz()就打印出number//2,並返回該值;
如果number是奇數,那么collatz()就打印,並返回3*number+1。
然后編寫一個程序,讓用戶輸入一個整數,並不斷對這個數調用,collatz(),直到函數返回值1(讓人驚奇的是,這個序列對於任何整數都有效,利用這個序列,你遲早會得到1!奇數數學家也不能確定為什么。你的程序在研究所謂的“Collatz序列”,它有時候被稱為“最簡單的、不可能的數學問題”)。
注意:記得將input()的返回值用int()函數轉成一個整數,否則它會是一個字符串。
提示:如果number%2==0,整數number就是偶數,如果number%2==1,它就是奇數。
這個程序的輸出看起來應該像這樣:
- Enter number: 3
- 3
- 10
- 5
- 16
- 8
- 4
- 2
- 1
我的程序如下:
#-*- coding:utf-8 -*- def collatz(number): if number % 2 ==0: return number//2 elif number % 2 == 1: return number*3+1 else: print('error') while True: keyinput = int(input()) getnum = collatz(keyinput) print(getnum) if getnum == 1: break
在上面的題目中添加try和except語句,檢測用戶是否輸入了一個非常整數的字符串。正常情況下,int()函數在傳入一個非整數字符串時,會產生ValueError錯誤,比如int('Happy')。在expect子句中,向用戶輸出一條信息,告訴他們必須輸入一個整數。
改進代碼如下:
# -*- coding:utf-8 -*- def collatz(number): if number % 2 ==0: return number//2 elif number % 2 == 1: return number*3+1 else: print('error') while True: try: keyinput = int(input()) getnum = collatz(keyinput) print(getnum) if getnum == 1: break except ValueError: print('you must input a int number')
運行結果如下:

但有一點,不對的地方是Collatz 序列是輸入一個任意的整數,讓計算機去默認執行,不再輸入,知道出現1執行結束。
所以看到網上的人的做法,對我的代碼進行改進之后。
改進代碼如下:
- import sys
- def collatz(number):
- print(number)
- if number == 1:
- sys.exit()
- elif number % 2 == 1 :
- t=number*3+1
- collatz(t)
- else:
- t=number//2
- collatz(t)
- if __name__=='__main__':
- n=input('Enter number: ')
- try:
- n=int(n)
- collatz(n)
- except ValueError as verror:
- print('ValueError: You need input digital.') (注:此處代碼是借鑒他人代碼。)