我写了一个递归程序来打印点之间的路径,但不打印任何东西!
public static void find(int a, int b, int [][] myArray)
{
System.out.print("thisWay " + a + " ");
if (myArray[a][b] != 0)
{
int point = myArray[a][b];
find(a, point, myArray);
System.out.print("thisWay " + point + " ");
find(point, b, myArray);
}
System.out.print("thisWay " + b + " ");
}
这是我的主要内容;
public static void main(String[] args)
{
int[][] myArray = new int[][]
{
{7, 0, 0, 8, 7, 8, 3, 0, 7},
{7, 0, 7, 0, 7, 8, 0, 2, 7},
{0, 4, 5, 1, 1, 8, 0, 1, 5},
};
find(2, 4, myArray);
}
答案 0 :(得分:1)
您需要检查此点是否超出数组边界,然后检查此点是否不等于零。 像这样的东西:
public class Main {
static int x=0;
public static void find(int a, int b, int [][] myArray) throws InterruptedException
{
System.out.println("thisWay " + a + " ");
if (myArray.length>a&&(myArray[0].length>b&&myArray[1].length>b&&myArray[2].length>b)&&myArray[a][b] != 0&&x<100)
{
x++;
int point = myArray[a][b];
find(a, point, myArray);
System.out.print("thisWay " + point + " ");
find(point, b, myArray);
}else{
System.out.print("thisWay " + b + " ");
}
}
public static void main(String[] args) throws InterruptedException
{
int[][] myArray = new int[][]
{
{7, 0, 0, 8, 7, 8, 3, 0, 7},
{7, 0, 7, 0, 7, 8, 0, 2, 7},
{0, 4, 5, 1, 1, 8, 0, 1, 5},
};
System.out.println(myArray.length);
find(1, 2, myArray);
}
}
答案 1 :(得分:1)
stdout
的I / O通常是缓冲的,可以阻止输出立即显示(stderr
isn&t; t),PrintStream
'\n'
实例System.out.print("some text...\n")
通常也是行缓冲的。
刷新缓冲区的最简单方法通常是打印System.out.println("some text...")
(例如scanf
或fscanf(inputFile,"%d",&grades[i][j]);
。
答案 2 :(得分:1)
尝试使用System.out.println()
而不是所有System.out.print()
语句,将其刷新到控制台。
除此之外,你应该注意两件事:
数组边界检查
如果a = 2,则b = 5 =&gt; point = 8,下次调用你将尝试myArray [8] [5],它应该给出一个ArrayIndexOutOfBoundsException
Sol:将数组的边界作为params发送到find方法,并检查a和b是否在该边界内
递归级别检查
你的程序有可能只是在该数组中无限循环搜索,所以你可能会在同一点获得StackOverflow异常
Sol:添加一个参数depth
,指定&#34; deep&#34;你想以递归方式递归,在每次递归调用时递减它,每次你输入find()方法时都要检查它是> 0
答案 3 :(得分:0)
当我运行你的代码时,我得到一个java.lang.StackOverflowError
,但它至少会打印出值,直到它出现错误。 System.out可能正在您的系统上缓冲。每次打印后调用System.out.flush()
来刷新它。