【发布时间】:2018-12-18 14:27:49
【问题描述】:
代码
import java.util.*;
public class AlmostPerfect {
public static void main(String[] args) {
Scanner x = new Scanner(System.in);
while(x.hasNext()) {
int n = x.nextInt();
int sum = recursion(n, n-1, 0);
if (sum == n) {
System.out.println(n + " perfect");
} else if ((n - sum) <= 2) {
System.out.println(n + " almost perfect");
} else {
System.out.println(n + " not perfect");
}
}
}
public static int recursion(int n, int x,int sum) {
if(x == 0){
return sum;
}
else if (n % x == 0) {
sum += x;
return recursion(n, x-1, sum);
}
else{
return recursion(n, x-1, sum);
}
}
}
我想基本上找出我的解决方案有什么问题...有一个解决方案,但我无法理解超出内存限制的属性。
【问题讨论】:
-
n可以达到十亿。想想最坏的情况:当n的值为1e9时,堆栈会发生什么?此外,您的代码和优化范围中还有一些其他错误。 -
你为什么要使用递归?一个简单的循环就可以了。
-
@Andreas 任何可以用循环完成的事情都可以用递归完成,反之亦然。
-
@EvOlaNdLuPiZ 当然,如果您维护自己的回溯信息堆栈,任何递归都可以写成循环,但代码可能更复杂。但是,this 代码不需要任何回溯信息,因此可以通过 simple 循环来完成。
-
递归将通过保留旧的递归变量在 OutOfMemory 上运行,或者如果调用堆栈达到 Integer.MAX_VALUE 的大小,则在 StackOverflowException 上运行。无论先出现什么,最好的解决方案是使用 for 循环
标签: java recursion memory limit