0. 使用遞歸編寫一個十進制轉換為二進制的函數(要求采用“取2取余”的方式,結果與調用bin()一樣返回字符串形式)。
me:
def gcd(x): if x <= 1: return str(x) else: return gcd(x//2) + str(x%2) print(gcd(12))
參考答案:
def Dec2Bin(dec): result = '' if dec: result = Dec2Bin(dec//2) return result + str(dec%2) else: return result print(Dec2Bin(62))
1. 寫一個函數get_digits(n),將參數n分解出每個位的數字並按順序存放到列表中。舉例:get_digits(12345) ==> [1, 2, 3, 4, 5]
me:
def get_digits(n): if len(n) == 1: return [n[len(n)-1]] else: return get_digits(n[:len(n)-1]) + [n[len(n)-1]] n=str(input("請輸入一個數字:")) print(get_digits(n))
參考答案:解題思路:利用除以10取余數的方式,每次調用get_digits(n//10),並將余數存放到列表中即可。要注意的是結束條件設置正確。
result = [] def get_digits(n): if n > 0: result.insert(0, n%10) get_digits(n//10) get_digits(12345) print(result)
2. 還記得求回文字符串那道題嗎?現在讓你使用遞歸的方式來求解,親還能驕傲的說我可以嗎?
me:
def get_hui(n): if len(n) == 1: return [True] elif len(n) == 2: return [n[1] == n[0]] else: return get_hui(n[1:len(n)-1]) + [n[len(n)-1] == n[0]] n= str(input("請輸入一句話:")) if len(n) == 1 : print("不是回文聯") else: if False in get_hui(n): print("不是回文聯") else: print("是回文聯")
參考答案:有好多種方法,不過綜合效率來說,小甲魚的實現方式比較朴素,利用遞歸每次索引前后兩個字符進行對比,當start > end的時候,也正是首尾下標“碰面”的時候,即作為結束遞歸的條件。
def is_palindrome(n, start, end): if start > end: return 1 else: return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0 string = input('請輸入一串字符串:') length = len(string)-1 if is_palindrome(string, 0, length): print('"%s"是回文字符串!' % string) else: print('"%s"不是回文字符串!' % string)
3. 使用遞歸編程求解以下問題:
有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最后問第一個人,他說是10歲。請問第五個人多大?
me:
def get_da(n): if n == 1: return 10 else: return get_da(n-1) + 2 print(get_da(5))
參考答案:利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數,需知道第四人的歲數,依次類推,推到第一人(10歲),再往回推。
def age(n): if n == 1: return 10 else: return age(n-1) + 2 print('哈哈,我知道了,第五個人的年齡是 %d 歲,啵啵脆!' % age(5))