递归函数打印数字的英文形式
我正在做一个程序,这个程序用递归函数来把数字转换成英文,比如说456会显示成“四 五 六”。我注意到之前有人问过这个问题,但我没能从中得到帮助。这个程序还要求用户输入多个数字,每个数字都要显示对应的英文数字。我尝试用列表来实现这个功能,但不太确定这样做是否正确。
现在我真的很困惑。我已经花了好几个小时在这个问题上,但进展不大。我并不是想让别人帮我写这个程序,只是希望能得到一些帮助。从理论上讲,我知道该怎么做,但把这些想法转化成代码却很困难。
def main():
List = createList()
print(createList())
def listValue(prompt):
try:
number = eval(input(prompt))
if type(number) == type(0) or type(number) == type(0.0):
return number
else:
print("\nYou did not enter a number. Try again.")
except NameError:
print("\nYou did not enter a number. Try again.")
except SyntaxError:
print("\nYou did not enter a number. Try again.")
except:
print("\nAn exception occured. Try again.")
if number != "":
return number
else:
return None
def createList():
#Create a blank list
newList = []
item = listValue("Enter a list of numbers (<Enter> to quit): ")
while item != None:
#Add user input to the end of the created list
newList.append(item)
item = listValue("Enter a list of numbers (<Enter> to quit): ")
return newList
def displayEnglishDigits(number):
numEnglish = {0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"}
digit = Number % 10
main()
这是我更新后的代码版本……有什么想法吗?
def getNumbers():
n = []
xStr = input("Enter first digit of number (negative to quit) >> ")
integer = int(xStr)
while integer >= 0:
while xStr != "":
x = eval(xStr)
n.append(x)
xStr = input("Enter next digit of number (negative to quit) >> ")
return n
def displayEnglishDigits(number):
numEnglish = {0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"}
number = getNumbers()
if len(number) == 0:
return None
if len(number) == 1:
return number[0]
else:
value = displayEnglishDigits(number[1:])
return value
def display(values):
print(displayEnglishDigits(number))
def main():
numb = getNumbers()
nums = displayEnglishDigits(numb)
display(nums)
main()
4 个回答
0
试试这个:
numEnglish = { 0:'zero ', 1:'one ', 2:'two ', 3:'three ', 4:'four ',
5:'five ', 6:'six', 7:'seven ', 8:'eight ', 9:'nine ' }
def displayEnglishDigits(number):
if number == 0:
return ""
digit = numEnglish[number % 10]
return displayEnglishDigits(number / 10) + digit
有两件事需要注意:首先,你得像上面那样定义一个叫做 num_names
的字典。其次,有一个特殊情况要注意 - 如果数字是0,就打印“零”。否则,就调用 displayEnglishDigits
。另外要注意,这个过程会返回一个包含数字的字符串,你可以在之后打印出来。
2
我知道你可能是为了学习这个,但无论如何:
不要用递归的方法。
有更简单的方法可以做到,而且你不会受到Python设置的最大递归限制的影响。只需使用下面的解决方案:
>>> def print_number(some_number):
for cipher in str(some_number):
print ['Zero', 'One', 'Two', 'Three', 'Four',
'Five', 'Six', 'Seven', 'Eight', 'Nine'][int(cipher)],
print
>>> print_number(126321)
One Two Six Three Two One
这个方法效果很好哦 :)
3
我们来重点讲讲递归函数,因为这就是主题。
你已经在 numEnglish
字典上打下了一个好基础。
为了完成它,不妨试试:把数字变成一个字符串(也就是一串字符),然后写一个递归函数来处理这个字符列表。
numEnglish = {0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"}
def recursiveDisplay(stringOfNumber):
if len(stringOfNumber) == 0: # base case: empty string
return
first = int(stringOfNumber[0]) # otherwise, grab the first element
english = numEnglish[first] # look it up in the dictionary
print english # print it
recursiveDisplay(stringOfNumber[1:]) # and recurse on the rest of the list
这个递归函数有两个情况:
- 1) 字符串是空的:处理完成。这就是基本情况。
- 2) 字符串不是空的:处理第一个字符,然后再递归调用自己,传入除了第一个字符以外的所有字符。这就是递归情况。
注意,字典 numEnglish
现在是在递归函数外部定义的。
当你调用 recursiveDisplay
时,确保传入的是一个字符串哦!
recursiveDisplay(str(myNumber))
注意:用递归处理列表在标准的 Python 中并不常见!