递归函数打印数字的英文形式

1 投票
4 回答
4716 浏览
提问于 2025-04-17 07:55

我正在做一个程序,这个程序用递归函数来把数字转换成英文,比如说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 中并不常见!

撰写回答