【零基礎】Python3學習課後練習題(二十一)
本文是跟著魚C論壇小甲魚零基礎學習Python3的視訊學習的,課後題也是跟隨每一課所附屬的題目來做的,根據自己的理解和標準答案記錄的筆記。
第二十三課與二十四課
測試題:
0.使用遞迴編寫一個十進位制轉換為二進位制的函式(要求採用“除2取餘”的方式,結果與呼叫bin()一樣返回字串形式)
答:通過地板除2的方法層層處理資料到底層,然後以除二取餘的方式得到二進位制的每一位數。
def dtbin(num): def tbin(num): result = '' if num: result = tbin( num // 2 ) return result += str(num % 2) else: return result if num == 0: return '0b' + '0' else: return '0b' + tbin(num)
原題解是上述函式中的內建函式 tbin() 的書寫方式,但是執行之後出現一個問題,就是在二進位制轉換的實現過程中 tbin() 有缺陷,即不能轉化出 0 的正確返回值,並且每次返回的只有二進位制程式碼的本身數值,而不同於原始 BIF 的 bin() 返回的是 '0b' 字首加上二進位制數值。所以為了改善補充原題解的不足,將其變為內建函式執行,在外部增加 0 的返回值並且新增 '0b' 的字首。從而使得此新函式結果與功能與原內建 BIF 的 bin() 函式一樣。
1.寫一個函式get_digits(n),將引數n分解出每個位的數字並按順序存放到列表中。舉例:get_digits(12345)==>[1,2,3,4,5]
答:通過地板除10的方法將目標引數一層層分離出來,然後以除10取餘的方式得到每個位置的數字。
def get_digits(n):
result = ''
if n:
result = get_digits(n//10)
result += str(n%10)
return list(result)
最終以列表的方式輸出。
2.還記得求迴文字串那道題嗎?現在讓你使用遞迴的方式來求解,親還能傲嬌的說我可以嗎?
答:通過首尾每一位進行比較的方法,先將目標引數分離出每一對首尾對應位的元素進行比較,形成內建判斷函式 hwlpd(),然後外函式整理目標引數的資料,去掉目標引數前後半段全等的情況以及全不等的情況。
def hwl(words):
start = 0
end = len(words) - 1
def hwlpd(words, start, end):
if start > end :
return 1
else:
if words[start] == words[end]:
return hwlpd(words, start + 1, end - 1)
else:
return 0
if hwlpd(words, start, end):
if words[0:len(words)//2] == words[len(words)//2:len(words)]:
print('%s 不是一個迴文聯字串'%words)
else:
print('%s 是一個迴文聯字串!'%words)
else:
print('%s 不是一個迴文聯字串'%words)
需要注意的是,原答案是寫出內建函式之後在全域性進行補充條件來跟進的,並且沒有新增全雜元素的目標引數物件的返回結果,所以我補充改善了這一點,並且將其整理成現在的一個內嵌型的複合函式。
3.使用遞迴程式設計求解以下問題:
有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數, 他說比第三個人大兩歲,問第三個人,又說比第二個人大兩歲,問第二個人,又說比第1個人大兩歲。 最後問第一個人,他說是10歲。請問第5個人多大?
答:利用遞迴的方法,遞迴分為回推和遞推兩個階段,要想知道第五個人的歲數,必須要知道第四個人的歲數,依次類推,推到第一個人10歲,再往回推。
def age(n):
if n == 0:
print('輸入有誤!')
elif n == 1:
return 10
else:
return age(n-1) + 2