递归函数,用英语打印数字的数字

时间:2011-12-07 19:50:55

标签: python recursion

我正在研究一个程序,它使用递归函数来打印英文数字的数字(即456会显示“Four Five Six”。)我注意到其他人最近问了这个问题,但我无法得到任何帮助它。该程序还要求从用户输入多个号码,并且每个号码都应显示相应的英文数字。我尝试在列表中执行此操作但不确定这是否正确。

现在我感到困惑。我已经在这个工作了几个小时了,并没有太多可以展示它。我不是在找任何人为我写这个程序,只是提供一些帮助。从理论上讲,我知道需要做什么,但我很难将其转化为代码。

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 :(得分: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!

答案 1 :(得分: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

它就像一个魅力:)

答案 2 :(得分: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。另请注意,de procedure返回带有数字的字符串,您可以在afterwsws后打印。

答案 3 :(得分:0)

请找到相同的代码,如果可能的话,请进一步减少。

from __future__ import print_function

helper={}
helper = {1:"one",
        2:"two",
3:"three",
4:"four",
5:"five",
6:"six",
7:"seven",
8:"eight",
9:"nine",
0:""}

face = {}
face = { 0:"zero",
1:
        {0:"",
        1:
                {0:"ten",
                1:"eleven",
                2:"twelve",
                3:"thirteen",
                4:"fourteen",
                5:"fifteen",
                6:"sixteen",
                7:"seventeen",
                8:"eighteen",
                9:"ninteen"
        },
        2:"twenty",
        3:"thirty",
        4:"fourty",
        5:"fifty",
        6:"sixty",
        7:"seventy",
        8:"eighty",
        9:"ninety"},
2:"hundred",
3:"thousand"}

result = ""
teen = ""

def rec_ntw(number, face_value=0):
        global result
        global teen
        if number <= 0:
                if face_value == 0:
                        result = "Zero"
                print (result)
                #return result
        else:
                if face_value == 0:
                        result = (helper[int(number % 10)])
                        teen = number % 10
                elif face_value == 1:
                        if number % 10 == 1:
                                result = (face[1][1][int(teen)]) + " "
                        else:
                                result = (face[int(face_value)][int(number % 10)]) + " " + result
                                teen = 0
                elif face_value == 2:
                        if number % 10 != 0:
                                result = (helper[int(number % 10)] + " " + str(face[int(face_value)]) + " ") + result
                else:
                        result = (helper[int(number % 10)] + " " + str(face[int(face_value)]) + " ") + result
                face_value += 1
                rec_ntw(number // 10, face_value)



while True:
        try:
                user_input = input("Please enter the number: ")
                rec_ntw(user_input)
        except KeyboardInterrupt:
                break