如何解决Pascal三角循环失败问题?

时间:2016-11-07 06:39:27

标签: java algorithm

  • 我在帕斯卡三角形上面临错误,但我不知道是否 它是java或我的代码,这是问题所在。这是代码:
import java.util.Scanner;

public class sdz {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int levels;
        levels = sc.nextInt();

        for(int i = 0; i <= levels; i++){
            for(int j =0; j <= i; j++){
                System.out.print(combinatorial(i,j) + " ");
            }

            System.out.println();

        }
    }
    static int fact(int n ){
        if(n > 0)
            return n * fact(n-1);
        else
            return 1;
    }

    static int combinatorial(int n , int r){

        return fact(n)/(fact(r) * fact(n-r));
    }

}

当我将等级输入到13时,它失败了,这就是结果 The loop at 13

2 个答案:

答案 0 :(得分:2)

这是由integer overflow问题引起的。事实(13)的结果是6227020800,它大于整数。

使用long(只会延迟问题),BigInteger或定义组合对象。并使用动态编程原则来避免重复计算,如@Kaidul所示

答案 1 :(得分:1)

我不知道它是整数溢出还是其他任何东西。我们能不那么麻烦地编写解决方案?

public static void pascalTriangle(int levels) {

        for (int i = 0; i <= levels; i++) {
            List<Integer> row = new ArrayList<>();
            int s = 1;
            for (int j = 0; j <= i; j++) {
                row.add(s);
                s = s * (i - j) / (j + 1);
            }
            System.out.println(row);
        }

}

我在这里使用了二项式系数公式 nCr+1 = nCr * (n -r) / (r + 1) 。我使用已经计算的结果nCr来避免重复计算。

在您的版本中,您每次都从头开始计算阶乘。也许使用记忆会很有用。

修改

此外,你实际上并不需要做任何组合的东西来计算帕斯卡三角形。您只需在上一级添加一些内容即可获得当前级别。

public static void pascalTriangle(int levels) {

    if (levels == 0) return;

    List<Integer> currList = new ArrayList<>();

    System.out.println("1");

    for (int i = 2; i <= levels; i++) {
        List<Integer> prevList = new ArrayList<>(currList);
        currList.clear(); 
        currList.add(1);
        for (int j = 0, k = 1; k < prevList.size(); j++, k++) {
            currList.add(prevList.get(j) + prevList.get(k));
        }
        currList.add(1);
        System.out.println(currList);
    }
}