Java 递归函数不能正常工作
我有一个任务要写一个程序,输入w,h和0到1之间的原始值数组,并输出表中“分子”的数量。W和h是桌子的宽度和高度。分子是表的一部分,它与值1相连,可以是向上或向下,也可以是向左或向右(没有对角线) 输入示例: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;
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分钟以上的时间回答一个问题以获得代表点,他们会生气。