Pascal Triangle递归程序不起作用

时间:2016-09-10 02:58:40

标签: java arrays recursion

这是我的代码......我是初学者,感谢任何反馈。我试图解决的问题是将pascal三角形打印到用户推算的行。

public class Pascal111 {

  int max;
  int r,c;
  public int pascal(int maxm){
  max=maxm;

  for(int r=0; r<max; r++){
    for (int c=0; c<r; c++){
     populate();}
 }  
  return max;
 }



  public void populate(){
   int[][] array=new int[max][max];
   if (r==0){
     array[0][0]=1;
   }
   else if(c==0){
     array[0][0]=1;
}
else if(c==r){
  array[r][c]=1;;
}
else
  array[r][c]=(array[r-1]+array[c-1]+array[r-1]+array[c]);
 }

}

我收到以下错误....

Error: bad operand types for binary operator '+'
  first type:  int[]
  second type: int[]

2 个答案:

答案 0 :(得分:1)

array[r][c]=(array[r-1]+array[c-1]+array[r-1]+array[c]);

错了。

array是一个二维数组,因此array[X]表示一个完整的行(一维数组)。你不能对1-D数组进行二进制操作,而是将它放在单个元素array[r][c]上。

而是用

替换它
array[r][c]=(array[r-1][c-1]+array[r-1][c]);

答案 1 :(得分:1)

虽然我没有密切关注这一点,但有一个错误突出:你有两个不同的名为r的变量和两个名为c的不同变量。

以下是代码的相关部分:

public class Pascal111 {

    int r,c;  // (A)

    public int pascal(int maxm) {
        for (int r=0; r<max; r++){    // (B)
            for (int c=0; c<r; c++){  // (B)
                populate();
            }
        }  
        return max;
    }

    public void populate() {
        if (r==0) {
            ... more code that accesses r and c
        }
    }

(A)处的声明声明实例变量,因为声明不在方法内部。这意味着无论何时创建Pascal111对象,此对象都将包含名为rc的字段。它们被初始化为0。

(B)的声明,因为它们上有int个关键字,声明了新的变量。这些变量是pascal方法的本地变量,这意味着只能在该方法内访问它们。 (实际上,只能在for循环内访问它们。)这些变量与实例变量有 no 连接。它们是完全分开的。当您递增这些本地rc变量时,实例变量保持不变。也就是说,他们仍然是0.

populate方法无法访问pascal中声明的局部变量。因此,当populate引用rc时,它们指的是实例变量。这些在循环中增加的变量,而是保持为0的实例变量。

解决此问题的一种方法是删除(B)中声明的int;这将导致pascal增加实例变量,然后populate将使用这些变量。 然而,这是错误的做法。

解决这些问题的最佳方法是不使用实例变量在pascalpopulate之间进行通信 - 而是使用参数。那就是:

    for (int r=0; r<max; r++){    // (B)
        for (int c=0; c<r; c++){  // (B)
            populate(r, c);
        }
    }  

以后:

public void populate(int r, int c) {

然后,当populate引用rc时,它将引用参数,这些参数实际上是局部变量。参数将来自r的{​​{1}}和c。 (但是,您不必为pascal变量和pascal参数使用相同的名称。)执行此操作后,您将发现实例变量不再存在需要的。无论如何,将实例变量用作循环索引总是或几乎总是错误的。

类似的错误:您在populate内有array作为局部变量。这意味着每次调用它以设置一个数组元素时,您都会创建一个全新的数组。然后,当populate返回时,无法再访问populate,因此您所做的任何工作都将丢失。