gpt4 book ai didi

java - 以Word形式递归打印1到1,000,000,stackoverflowexception

转载 作者:行者123 更新时间:2023-11-30 06:31:00 24 4
gpt4 key购买 nike

首先,我想说这是我的第一篇帖子,虽然我从未在 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

我的代码运行到 8,980,只是运行到 10,000 进行测试,但随后我遇到了 Stack Overflow。我不确定 JVM 是否只留出足够的内存来运行到 8,980,或者它是否在我的代码中。我在下面写了条件的分解,并在下面粘贴了完整的代码。

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" };

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

   public void toOneMillion(int n) {
String number = Integer.toString(n);
String newNumber = "";

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

newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))] + THOUSAND;

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

System.out.print(newNumber);
number = number.substring(1, 4);

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

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

完整代码

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

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" };

public void toOneMillion(int n) {
String number = Integer.toString(n);
String newNumber = "";

if (n == 10000) {
System.out.println("10000");
} else if (n > 0) {
if (n >= 100) {
if (n >= 1000) {
if (n % 1000 == 0) {
newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))] + THOUSAND;
System.out.print(newNumber);
number = number.substring(1, 4);
} else {
newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))] + THOUSAND;
System.out.print(newNumber);
number = number.substring(1, 4);
// System.out.println("HELLO!" + number + " " + n);

}
}

if (Integer.parseInt(number) != 0) {
if (n % 100 == 0) {
if(zeroToNineteen[Integer.parseInt(number.substring(0, 1))].equals("")) {
newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))];
System.out.print(newNumber);
number = number.substring(1, 3);
} else {
newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))] + HUNDRED;
System.out.print(newNumber);
number = number.substring(1, 3);
}
} else {
if(zeroToNineteen[Integer.parseInt(number.substring(0, 1))].equals("")) {
newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))] + "and ";
System.out.print(newNumber);
number = number.substring(1, 3);
} else {
newNumber = zeroToNineteen[Integer.parseInt(number.substring(0, 1))] + HUNDRED + "and ";
System.out.print(newNumber);
number = number.substring(1, 3);
}
// System.out.println("HELLO!" + number + " " + n);

}
}
}
if (Integer.parseInt(number) < 20) {
System.out.println(zeroToNineteen[Integer.parseInt(number)]);
toOneMillion(n + 1);
} else {
if (n % 10 == 0) {
number = number.substring(0, 1);
newNumber = twentyToOneHundred[Integer.parseInt(number)];
System.out.println(newNumber);
toOneMillion(n + 1);
} else {
newNumber = twentyToOneHundred[Integer.parseInt(number
.substring(0, 1))];
newNumber += zeroToNineteen[Integer.parseInt(number
.substring(1))];
System.out.println(newNumber);
toOneMillion(n + 1);
}
}
}
}
}

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

最佳答案

我觉得您误解了他们期望递归的位置。

更多地按照以下思路思考:

for(int i=0; i<100000; i++){
printNumberRecursively(i);
}

其中 printNumberRecursively 一次递归地遍历一个数字。

如果我错了,那么这个作业就是荒谬的。

关于java - 以Word形式递归打印1到1,000,000,stackoverflowexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9983441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com