Palindrome程序,不能终止循环,Project Euler#4

时间:2014-01-05 22:39:43

标签: java loops recursion

import java.util.ArrayList;
public class Euler4{
    public static void main(String [] args){
                int size = 0;
        int product = 0;

        for(int i = 102; i > 100; i--){
            for(int j = 102; j > 100; j--){
                ArrayList<Integer> digits = new ArrayList<Integer>();
                product = i*j;
                int index = 0;
                while(product > 0){
                    digits.add(index,product%10);
                    product /= 10;
                    index++;
                }
                for(int element : digits)
                    System.out.println("digits :" + element);   
                size = digits.size() - 1;

                if(test(0,size,digits)){
                    System.out.println("i and j " + i + " " + j);
                    break;  
                }
            }
        }
    }

    public static boolean test(int i, int size, ArrayList<Integer> digits){

        if(digits.get(size).equals(digits.get(i))){

            if(size == i || size - i == 1){
                return true;

            }else{
                System.out.println("i: " + i + " size: " + size + " digits@i: " + digits.get(i) +" digits@size " + digits.get(i));
                size--;
                i++;

                if(!test(i, size, digits))  
                    return false;
            }   
        }
        return false;
    }
}

这是输出:

digits :4 index: 0
digits :0 index: 1
digits :4 index: 2
digits :0 index: 3
digits :1 index: 4
digits :2 index: 0
digits :0 index: 1
digits :3 index: 2
digits :0 index: 3
digits :1 index: 4
digits :2 index: 0
digits :0 index: 1
digits :3 index: 2
digits :0 index: 3
digits :1 index: 4
digits :1 index: 0
digits :0 index: 1
digits :2 index: 2
digits :0 index: 3
digits :1 index: 4
i: 0 size: 4 digits@i: 1 digits@size 1
i: 1 size: 3 digits@i: 0 digits@size 0

我认为while循环存在问题,并且递归存在问题。通过test()方法运行的值是进入数组的最后一组值,即10201,因此即使while循环搞砸了,递归方法仍然应该返回true。我不知道为什么不是。

这是问题所在: http://projecteuler.net/problem=4

感谢。

编辑:我把它修复得更有效率,并给出最大回文而不是仅列出回文。如果有人有兴趣,这是决赛:http://pastebin.com/qJUpZVzK

3 个答案:

答案 0 :(得分:1)

您对test的第三次通话正在返回true,但您对test的第二次通话未使用该值。当你真的希望它返回false时,它会落到方法的底部并返回true

当您递归调用test时,如果递归调用返回true,您希望返回test(来自true)。

更改

if(!test(i, size, digits))  
      return false;

靠近底部,

return test(i, size, digits);

答案 1 :(得分:0)

你的循环永远不会达到0,因为条件总会得到满足。

            while(product > 0){
                digits.add(index,product%10);
                product /= 10;
                index++;
            }

老实说,我认为检查回文的最简单方法是:

public boolean palindrome (int n) {
    return String.valueOf(n).equals(new StringBuilder(String.valueOf(n)).reverse().toString());
}

答案 2 :(得分:-1)

问题在于:

while(product > 0){
    digits.add(index,product%10);
    product /= 10;
    index++;
}

product永远不能减少为负数(小于0),除以10;这意味着你永远不会退出这个循环。让我们进一步看看:

1- product is created and it's value is 102*102=10404. (The first time through the for loops.)
2- product is divided by 10 to get 1040.4
3- While loop is checked, 1040.4 > 0, enter again.
4- product is divided by 10 to get 104.04
5- While loop is checked, 104.04 > 0, enter again.

无限重复步骤4和5,因为即使你保持在1以下,它也总是高于0.(例如0.0000000000000010404&gt; 0)