【问题标题】:How to make code runs only once after recursion?如何使代码在递归后只运行一次?
【发布时间】:2019-10-07 19:42:45
【问题描述】:
hourglassSum(arr) 方法一开始是从 main 方法调用的。然后该方法是递归的,直到语句失败。递归后,执行 sumArray 的迭代。我以为它只会执行一次。但它不像我预期的那样工作。递归后如何让它只运行一次?
我尝试将标志设置为局部变量。
运行以下代码
static int rowIncrement=0;
static int columnIncrement=0;
static int[] sumArray = new int[16];
static int count=0;
static void hourglassSum(int[][] arr) {
int sum=0;
int size=arr.length/2;
for(int i=rowIncrement;i<size+rowIncrement;i++) {
for(int j=columnIncrement;j<size+columnIncrement;j++) {
sum = sum+arr[i][j];
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
System.out.println(sum);
sumArray[count]=sum;
System.out.println();
columnIncrement++;
if(columnIncrement==(arr.length/2)+1) {
rowIncrement++;
columnIncrement=0;
}
if(rowIncrement<(arr.length/2)+1) {
count++;
hourglassSum(arr);
}
//doubt : is it execute only once.
for(int i=0;i<sumArray.length;i++) {
System.out.println(sumArray[i]+" ");
}
}
【问题讨论】:
标签:
java
arrays
recursion
break
【解决方案1】:
你的代码没有解释清楚..
您可以在函数调用中添加一个布尔对象,并在完成递归时将其设置为 false,
请参阅以下内容:
private static void hourglassSum(int[][] arr,Boolean bool) {
int sum = 0;
int size = arr.length / 2;
for (int i = rowIncrement; i < size + rowIncrement; i++) {
for (int j = columnIncrement; j < size + columnIncrement; j++) {
sum = sum + arr[i][j];
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
System.out.println(sum);
sumArray[count] = sum;
System.out.println();
columnIncrement++;
if (columnIncrement == (arr.length / 2) + 1) {
rowIncrement++;
columnIncrement = 0;
}
if (rowIncrement < (arr.length / 2) + 1) {
count++;
hourglassSum(arr,bool);
if(bool){
bool=false;
return;
}
}
System.out.println("out");
//doubt : is it execute only once.
for (int i = 0; i < sumArray.length; i++) {
System.out.println(sumArray[i] + " ");
}
}
注意:调用 hourglassSum(arr,true)
【解决方案2】:
我认为您可能正在寻找的是包装函数。就目前而言,您的 for 循环在您的递归方法中运行,因此每次调用该方法时,它都会运行 for 循环。听起来您希望它运行递归方法,然后最后打印出结果。为此,您可以将所有递归代码放入所谓的辅助方法中,并将其命名为 hourglassSumHelper() 或类似名称:
private static void hourglassSumHelper(int[][] arr) {
int sum=0;
int size=arr.length/2;
for(int i=rowIncrement;i<size+rowIncrement;i++) {
for(int j=columnIncrement;j<size+columnIncrement;j++) {
sum = sum+arr[i][j];
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
System.out.println(sum);
sumArray[count]=sum;
System.out.println();
columnIncrement++;
if(columnIncrement==(arr.length/2)+1) {
rowIncrement++;
columnIncrement=0;
}
if(rowIncrement<(arr.length/2)+1) {
count++;
hourglassSumHelper(arr); // Make sure you change the recursive call as well
}
}
然后将hourglassSum()做成一个包装函数,其唯一目的是调用helper方法,然后打印出结果:
static void hourglassSum(int[][] arr) {
hourglassSumHelper(arr);
for(int i=0;i<sumArray.length;i++) {
System.out.println(sumArray[i]+" ");
}
}
现在当你调用hourglassSum()时,它会调用helper方法,然后只有从方法返回时才会打印一次答案。