Java 递归函数不能正常工作

Java 递归函数不能正常工作,java,arrays,recursion,Java,Arrays,Recursion,我有一个任务要写一个程序,输入w,h和0到1之间的原始值数组,并输出表中“分子”的数量。W和h是桌子的宽度和高度。分子是表的一部分,它与值1相连,可以是向上或向下,也可以是向左或向右(没有对角线) 输入示例: 4 1101 1000 1011 1001 输出: 三, 我编写了一个程序,生成一个带有预定义的w和h的数组,并用0到1(含0到1)的值随机填充它们,这样我就可以测试我的递归函数,但我被卡住了。我的函数不想“左转”/j——可能还有我--。有什么想法吗 package firstSoup;

我有一个任务要写一个程序,输入w,h和0到1之间的原始值数组,并输出表中“分子”的数量。W和h是桌子的宽度和高度。分子是表的一部分,它与值1相连,可以是向上或向下,也可以是向左或向右(没有对角线)

输入示例:
4
1101
1000
1011
1001

输出: 三,

我编写了一个程序,生成一个带有预定义的w和h的数组,并用0到1(含0到1)的值随机填充它们,这样我就可以测试我的递归函数,但我被卡住了。我的函数不想“左转”/j——可能还有我--。有什么想法吗

package firstSoup;

import java.util.Random;
import java.util.Scanner;

public class SoupMain {

static int width = 6;
static int height = 4;

static int[][] table;
static int moleculeCount = 0;

public static void main(String[] args) {

    Random random = new Random();       

    table = new int[height][width];

    //Fill the table with random numbers between 0 and 1 inclusive
    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            table[i][j] = random.nextInt(2);
        }
    }

    //Check the the table for a possible value of 1 and turn the whole "molecule" to value of 0
    //Increment moleculeCount
    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            if(table[i][j] == 1){
                turnOff(i, j);
                moleculeCount++;
            }
        }
    }
}

//Recursive function for turning only the values of 1 that are connected ("molecule") to 0
public static void turnOff(int i, int j){
    if(table[i][j] == 1){
        table[i][j] = 0;

        if(j < width-1){
        turnOff(i, j++);
        }

        if(j > 0){
        turnOff(i, j--);
        }

        if(i < height-1){
        turnOff(i++, j);
        }

        if(i > 0){
        turnOff(i--, j);
        }

    }else{
        return;
    }       
}
}
packagefirstsoup;
导入java.util.Random;
导入java.util.Scanner;
公共类SoupMain{
静态整数宽度=6;
静态整数高度=4;
静态int[][]表;
静态int分子计数=0;
公共静态void main(字符串[]args){
随机=新随机();
表=新整数[高度][宽度];
//用0到1(含0和1)之间的随机数填充表格
对于(int i=0;i0){
关断(i,j-);
}
如果(i<高度-1){
关断(i++,j);
}
如果(i>0){
关断(i--,j);
}
}否则{
返回;
}       
}
}
这是每个第一次关机呼叫的程序流程:
输入:
100100
101110
110011
100011

1
000100
001110
000011
000011
2
000000
001000
000000
000000
3
000000
000000
000000
000000
输出=3

当它看起来像这样时:
输入:
100100
101110
110011
100011

1
000100
001110
000011
000011
2
000000
000000
000000
000000

Output=2

您的问题是,在进行递归调用时,使用后缀运算符来增加/减少索引值。在这种情况下,
i+1
i++
做了非常不同的事情

i++
i--
不仅仅计算为
'比我多一个'
'比我少一个'
,它们还会在程序中更改
i
的值。此外,它们仅在使用后计算为递增/递减值

让我们看看当你的董事会看起来像这样时会发生什么:

000100
001110
000011
000011
主循环将调用
关闭(0,3)
,如下所示:

public static void turnOff(int i, int j) {
    // i=0, j=3
    if (table[i][j] == 1) {
        table[i][j] = 0;

        if (j < width - 1) {
            turnOff(i, j++);  // calls turnOff(0,3) and sets j=4
        }

        if (j > 0) {
            turnOff(i, j--); // calls turnOff(0,4) and sets j=3
        }

        //etc
公共静态无效关闭(int i,int j){
//i=0,j=3
如果(表[i][j]==1){
表[i][j]=0;
如果(j0){
关闭(i,j--);//调用关闭(0,4)并设置j=3
}
//等
这会破坏边界检查,导致许多无序和冗余调用,从而破坏算法。您要做的是在与当前单元格相邻的每个单元格上调用递归方法:

public static void turnOff(int i, int j) {
    // i=0, j=3
    if (table[i][j] == 1) {
        table[i][j] = 0;

        if (j < width - 1) {
            turnOff(i, j+1);  // calls turnOff(0,4)
        }

        if (j > 0) {
            turnOff(i, j-1);  // calls turnOff(0,2)
        }

        //etc
公共静态无效关闭(int i,int j){
//i=0,j=3
如果(表[i][j]==1){
表[i][j]=0;
如果(j0){
关断(i,j-1);//调用关断(0,2)
}
//等

从长远来看,我再怎么强调学习使用调试器的重要性也不为过。你的大脑“看到”你认为你写了什么,而不是你实际写了什么。除非你在变量上设置了一个手表,看到它做了一些意想不到的事情,否则通常很难确定你的程序在哪里误入歧途。

如果表看起来像0010 0010 0111 1111,分子数应该是3,但它应该是1,因为我们不知道是什么如果
关闭
不能正常工作,请提供输入数组(你必须让
程序在随机生成后打印)、预期输出和实际输出。如“不能正常工作”和“我的函数不想左转”等语句不要向我们提供任何我们可以帮助您的信息。我试图扩展和澄清问题。非常感谢您花时间解释问题。我正在使用调试器,但老实说,我仍然迷失在更大的堆栈中。我也在花时间找出解决方案,我注意到我的大脑开始松弛经过几个小时左右的“紧张”盯着编辑:)谢谢你恢复了我对堆栈溢出的信心。有时我觉得如果人们不得不花5分钟以上的时间回答一个问题以获得代表点,他们会生气。