摘要:[Python] 遞迴解 number digital into number pronunciation
最近在checkio上面磨練自己的程式功力,發現好多高手程式設計的思維讓人望塵莫及。
以下是要解的題目是將數字轉換為英文數字的單字字串:
Input: Integer number from 0 to 999.
Output: A string representation of this number.
Result:
checkio(4)=='four' checkio(143)=='one hundred forty three' checkio(12)=='twelve' checkio(101)=='one hundred one' checkio(212)=='two hundred twelve' checkio(40)=='forty'
我的解法很直觀,直接對位數拆解,大多數的人也是依照這種想法來解:
FIRST_TEN = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] SECOND_TEN = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"] OTHER_TENS = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] HUNDRED = "hundred" def checkio(number): result = [] f = lambda x, y: (x/y, x%y) for i in [2, 1, 0]: quotient, remainder = f(number, 10**i) if i == 2: if quotient > 0: result += [FIRST_TEN[quotient], HUNDRED] if remainder == 0: break number = remainder if i == 1: if quotient >= 2: result += [OTHER_TENS[quotient-2]] if remainder == 0: break number = remainder if i == 0: if quotient >= 10 and quotient < 20: result += [SECOND_TEN[quotient-10]] break elif quotient < 10: result += [FIRST_TEN[quotient]] return ' '.join(result)
以下是遞迴解 - 這需要花點力氣來看懂,更遑論要想到這樣的解法,以前教授也有提過大部分的programmer都不擅長用遞迴來解題,主要是因為在演算法的邏輯上大多不太直觀。
def checkio(i): if i < 20: result = 'zero,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen'.split(',')[i] elif i < 100: result = ',,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety'.split(',')[i / 10] if i % 10: result += ' ' + checkio(i % 10) elif i < 1000: result = checkio(i / 100) + ' hundred' if i % 100: result += ' ' + checkio(i % 100) return result