0

我被分配了一项任务,我们必须使用递归方法以英文形式逐位打印出一个整数。EG 534 打印出“五三四”。

这就是我所拥有的:

int englishInt(int num) {
    if(num < 10) {
        switch(num) {
            case 0: cout << "zero ";
            case 1: cout << "one ";
            case 2: cout << "two ";
            case 3: cout << "three ";
            case 4: cout << "four ";
            case 5: cout << "five ";
            case 6: cout << "six ";
            case 7: cout << "seven ";
            case 8: cout << "eight ";
            case 9: cout << "nine ";
        }
    } else
        return englishInt(num / 10);
}

出于某种原因,它正在打印英文中的最低位到最高位......这不应该一直返回直到它到达第一个数字然后打印出来,然后在堆栈展开时打印出每个数字?

4

5 回答 5

4

举个例子,比如 537。

englishInt(537) -- prints nothing, calls
    englishInt(53) -- prints nothing, calls
        englishInt(5) -- prints "five six seven eight nine"

原因是:

  1. 您的案件中没有任何break陈述。
  2. 如果num >= 10.
于 2013-02-25T04:59:54.820 回答
2

发生这种情况是因为您的方法在递归调用中没有做任何事情。您应该在每次调用中进行打印,但仅当num不为零时才向下递归。

算法(伪代码)应如下所示:

englishInt(int num) {
    if (num != 0) {
        englishInt(num/10)
    }
    cout << english letter for (num % 10)
}

您需要一个特殊情况num == 0,以便调用englishInt(0)会产生一些输出。

于 2013-02-25T04:59:48.147 回答
1

首先,我看到修复代码的最小变化。

  1. break在交换机的每个输出后添加一个。
  2. 在输出之前递归,并且总是在之后输出。

所以,

void englishInt(int num)
{
    if (num >=10)
        englishInt(num/10);

    switch(num % 10)
    {
        case 0: cout << "zero "; break;
        case 1: cout << "one "; break;
        case 2: cout << "two "; break;
        case 3: cout << "three "; break;
        case 4: cout << "four "; break;
        case 5: cout << "five "; break;
        case 6: cout << "six "; break;
        case 7: cout << "seven "; break;
        case 8: cout << "eight "; break;
        case 9: cout << "nine "; break;
    }
}

放弃开关

我没有关注你为什么首先有一个 switch 语句。如果您查看您的开关,您总是在评估0..9. 那么为什么不使用该数字作为十个字符串数组的简单索引:

#include <iostream>
using namespace std;

void print_num(unsigned int num)
{
    static const char *strs[] =
    {
        "zero", "one", "two", "three", "four",
        "five", "six", "seven", "eight", "nine"
    };

    if (num >= 10)
        print_num(num/10);
    cout << strs[num % 10] << ' ';
}

int main(int argc, char *argv[])
{
    print_num(100); cout << endl;
    print_num(12345);  cout << endl;
    print_num(3);  cout << endl;
    print_num(1024*1024*1024); cout << endl;
    return 0;
}

输出

one zero zero 
one two three four five 
three 
one zero seven three seven four one eight two four 
于 2013-02-25T05:07:57.477 回答
0

您的代码有几个问题。

首先,您的 switch 语句被破坏了:您忘记break在每个 case 之后放置一个语句,因此在递归结束时,您的程序将打印出最高有效数字,然后遍历更大的数字直到 9。

修复它如下:

   switch(num) {
        case 0: cout << "zero "; break;
        case 1: cout << "one "; break;
        case 2: cout << "two "; break; 
        case 3: cout << "three "; break;
        case 4: cout << "four "; break;
        case 5: cout << "five "; break; 
        case 6: cout << "six "; break;
        case 7: cout << "seven "; break; 
        case 8: cout << "eight "; break;
        case 9: cout << "nine "; break;
    }

其次,您的程序将仅输出最高有效数字。您不会为中间步骤打印任何内容。这不是你的代码的问题,而是你的算法的问题,所以你必须自己解决这个问题。

于 2013-02-25T05:13:11.843 回答
-1

一个疯狂的方法

int main()
{
   int n;
   char s[32];
   char word[10][10]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

   cout << "enter a number" << endl;
   cin >> n;

   sprintf(s,"%d", n );

   for( int i = 0; s[i] != '\0'; i++)
   {
       cout << word[s[i]-'0'];
   }

   return 0;
}
于 2013-02-25T05:00:44.907 回答