Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Euler 12项目,Java解决方案尝试,递归错误?_Java_Recursion - Fatal编程技术网

Euler 12项目,Java解决方案尝试,递归错误?

Euler 12项目,Java解决方案尝试,递归错误?,java,recursion,Java,Recursion,我只需要一些关于改进我的问题解决方案的建议。请不要把解决方案交给我,因为我想自己完成。下面是我使用递归解决Euler Prob 12项目的尝试。这个问题要求第一个有500个以上除数的三角形数 我看不出有什么问题;Eclipse也没有显示任何错误。它只是继续运行,没有找到答案 public class P012 { public static void main(String[] args) { int m=2; int c=1; int

我只需要一些关于改进我的问题解决方案的建议。请不要把解决方案交给我,因为我想自己完成。下面是我使用递归解决Euler Prob 12项目的尝试。这个问题要求第一个有500个以上除数的三角形数

我看不出有什么问题;Eclipse也没有显示任何错误。它只是继续运行,没有找到答案

public class P012 {
    public static void main(String[] args) {

        int m=2;
        int c=1;
        int d=(c*(c+1)/2);

        while (numDivs(d,m)<=499) {
            c++;
            d=(c*(c+1)/2);
        }
        System.out.println(d);

    }

    public static int numDivs(int a, int b) {
        int foo=2;
        while (b < a/2) {
            if ((a%b)==0)
                foo++;
            b++;
            numDivs(a,b);
        }
        return foo;

    }
}
公共类P012{
公共静态void main(字符串[]args){
int m=2;
int c=1;
int d=(c*(c+1)/2);

而(numDivs(d,m)您使用的是一个非常简单的算法。您可能应该对此进行改进

1) 您确定答案将符合
int

想一想,做一些测试

2) 例如,您可以使用
计数其除数的数字。如果素数分解为:
M=p1^k1*p2^k2*…pN^kN

那么
M
的除数的计数是:
(k1+1)*(k2+1)*…*(kN+1)

3) 您可能需要将所有素数筛选到给定的预选值
(例如,高达10000000)以更快地实施2)

4) 即使采用这种幼稚的方法,我也不认为您的方法
逻辑正确,即先在几个小数字上测试

另见:


我只是自己计算了这个问题,我可以说你的方法基本上是可行的。数字并不像我一开始想象的那么大。最大的问题是numDivs中不必要的递归调用。只需使用while循环计算它(在这种情况下,函数只需要一个参数)。然后它确实需要大约一两分钟才能运行(您需要计算12000多个三角形数,这还不算太糟)。不过,您的numDivs有一个错误,您应该在b处中断while循环查看对numDivs()的递归调用。已计算出其参数所指示的除数,并已返回该值。您对返回的值做了什么?您真的要对其执行此操作吗


另一个单独的提示。你的循环限制a/2太高了。你可以降低它。

那么什么是Project Euler 12?当东西继续运行时,你可以经常使用调试器或System.out来检查值,看看它们是否符合你的预期。是的,这需要很长时间,你试过等待吗?@duffymo:他在调用递归函数之前有b++方法。这应该终止。只是性能不是最佳的。是的,他想要除数的数量,因为这是问题要求的:a/2作为限制也是正确的,因为不仅搜索素数除数。他自动找到的每个除数都有一个对应项:除数成对出现。你只需要计算每对除数中的较低者当你找到它时,加上2——考虑到平方数。是的,你是对的。但它不是必需的。我只是用简单的方法计算了它,只需要大约一分钟。我的Java实现只需要半秒多。提问者的问题是,他没有正确计算除数,因此永远不会达到500.Thus他的程序从不停止,最终会填满堆空间。他的实现中最大的问题是不必要的递归调用,他可以简单地将其删除。是的,在某些情况下,它计算的因子是错误的,精确地说,如果三角形数是偶数,他可能会错过一个。他可能会幸运地抓住正确的一个,或者以后的一个是501尽管如此。