【问题标题】:Pascal Triangle recursive program not working帕斯卡三角递归程序不起作用
【发布时间】:2016-09-10 12:26:39
【问题描述】:

这是我的代码...我是初学者,感谢任何反馈。我要解决的问题是将帕斯卡三角形打印到用户估算的行。

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[]

【问题讨论】:

  • 我知道这段代码在很多方面都被破坏了......如果你能告诉我,我很难理解递归!
  • 为什么你认为你的程序是递归的?

标签: java arrays recursion


【解决方案1】:
array[r][c]=(array[r-1]+array[c-1]+array[r-1]+array[c]);

错了。

array 是一个二维数组,因此array[X] 代表一个完整的行(一维数组)。您只是不能对一维数组进行二元运算并将其放在单个元素array[r][c]

替换为

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

【讨论】:

  • 现在程序已编译,但我得到以下结果1 1 1 1 1 1 1 1 1 1 1
  • 你还需要把else if(c==0){ array[0][0]=1;改成else if(c==0){ array[r][0]=1;
  • 我进行了调整,仍然得到相同的输入!我也对 r==0 做了同样的调整
【解决方案2】:

虽然我没有仔细研究过这一点,但有一个错误很明显:您有两个名为 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 循环内访问。)这些变量与实例变量没有 连接。他们是完全分开的。当您增加这些本地 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时,它会引用参数,这些参数本质上是局部变量。参数将是来自pascalrc。 (但您不必为pascal 变量和populate 参数使用相同的名称。)执行此操作后,您会发现根本不再需要实例变量。无论如何,将实例变量用作循环索引总是或几乎总是错误的。

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

【讨论】:

  • 哇。这是迄今为止最好的答案。现在这很有意义。我看过一个与您的答案相似的先前答案,但我无法理解。现在我完全明白了。 PS你应该是老师!
  • 您介意我不时向您发送有关我遇到的问题的快速问题吗?
  • 另外,在哪里可以将数组作为变量放置,这样每次调用 populate 时它都不会被删除?
  • 关于最后一个问题:两个不错的选择。 (1) 使数组成为实例变量,并在对象的构造函数中对其进行初始化。 (2)在pascal方法中声明,作为参数传递给populate。数组是一个引用,所以如果你做最后一个,你仍然可以在populate 中修改它,即使Java 是按值传递的。
  • 您可以尝试发送消息,但请注意,我没有时间以这种方式按需回答问题。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多