以Word形式递归打印1到1,000,000,stackoverflowException

Jon*_*nly 2 java stack-overflow

首先,我想说这是我的第一篇帖子,虽然我从未在 StackOverflow.com 上发过帖子,但这里的人们给了我很大的帮助,我希望我能回去并为所有发布过帖子的帖子 +1。帮助过我。

话虽这么说,我在算法课上接到了一项作业,其中我必须递归地将数字 1 到 1,000,000 转换为其单词计数器部分。

例如从 1 到 1,000,000

one
two
three

...and so on...

one hundred and ninetyseven
one hundred and ninetyeight
one hundred and ninetynine
two hundred

...and so on...

nine hundred and ninetynine thousand nine hundred and ninetyeight
nine hundred and ninetynine thousand nine hundred and ninetynine
one million
Run Code Online (Sandbox Code Playgroud)

我的代码可以运行到 8,980,只是为了测试而运行到 10,000,但随后我遇到了堆栈溢出。我不确定 JVM 是否预留了足够的内存来运行 8,980,或者是否是我的代码中的某些内容。我在下面写了我的条件的分解,并将完整的代码粘贴在下面。

one
two
three

...and so on...

one hundred and ninetyseven
one hundred and ninetyeight
one hundred and ninetynine
two hundred

...and so on...

nine hundred and ninetynine thousand nine hundred and ninetyeight
nine hundred and ninetynine thousand nine hundred and ninetynine
one million
Run Code Online (Sandbox Code Playgroud)

以下递归方法是我的数字类中唯一的方法。

public class Numbers {

        private final String HUNDRED = " hundred ";
        private final String THOUSAND = " thousand ";

        private String[] zeroToNineteen = { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
        private String[] twentyToOneHundred = { "", "", "twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety" };
Run Code Online (Sandbox Code Playgroud)

我首先通过 的方式将一个字符串设置number为参数。 然后,对于每个条件语句,我找出序列中的第一个数字,然后使用该数字将字符串设置为正确数组中的索引值。nInteger.toString(n)
newNumber

   public void toOneMillion(int n) {
            String number = Integer.toString(n);
            String newNumber = "";
Run Code Online (Sandbox Code Playgroud)

之后,我打印newNumber到控制台,然后删除第一个数字number并让它下降到下一个条件。

newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))] + THOUSAND;
Run Code Online (Sandbox Code Playgroud)

然后,我重复此步骤,直到数字落在 0 到 100 之间。然后,我将数字打印到控制台并进行递归调用,toOneMillion(n+1);直到n等于 10,000(用于测试目的)。

我想我的问题是,是否有可能在不遇到 stackoverflow 的情况下实现 1 到 1,000,000 ?另外,如果您在我的代码中看到不应该存在的内容或可以以更有效的方式编写的代码(我知道整个事情可以以更有效的方式编写,我只是想知道更小的事情)可以你指出并也许解释一下?非常感谢您阅读本文,也感谢您提供的任何帮助。

完整代码

我有一个主类,它创建数字类的实例,并通过 - ... 调用递归方法numbers.toOneMillion(1),这是我的项目文件夹中唯一的其他类,所以这就是有问题的类。

System.out.print(newNumber);
number = number.substring(1, 4);
Run Code Online (Sandbox Code Playgroud)

我意识到我的代码很混乱,我应该将所有条件分解为一个方法,为每个条件处理相同的事情,我只想先让代码工作,然后完善它。另外,我几乎肯定有一种更有效的方法来完成我想做的事情,但是我的大脑和思维处理想出了这个,所以不要讨厌努力。

Jam*_*gne 5

我有一种感觉,你误解了他们期望递归的地方。

更多地思考:

for(int i=0; i<100000; i++){
   printNumberRecursively(i);
}
Run Code Online (Sandbox Code Playgroud)

其中printNumberRecursively每次递归一位数字。

如果我错了,那么这个任务就很荒谬了。