有人能解释一下java递归是如何工作的吗,特别是在下面的这个程序中?
下面的每一行代码都做什么?我对Java非常陌生,我很难理解递归有人能解释一下java递归是如何工作的吗,特别是在下面的这个程序中?,java,recursion,Java,Recursion,下面的每一行代码都做什么?我对Java非常陌生,我很难理解递归 `public class RecursionExamples { static Scanner in = new Scanner(System.in); public static void main(String[] args) { //use recursion to print a list in reverse order int[] numList = { 10,
`public class RecursionExamples {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
//use recursion to print a list in reverse order
int[] numList = {
10,
20,
30,
40,
50
};
reversePrint(numList);
System.out.println("");
}
private static void reversePrint(int[] numbers) {
if (numbers.length == 0)
return;
int[] a = new int[numbers.length - 1];
for (int i = 0; i < numbers.length - 1; i++)
a[i] = numbers[i + 1];
reversePrint(a);
System.out.println(numbers[0] + "");
}
}`
`公共类递归示例{
静态扫描仪输入=新扫描仪(系统输入);
公共静态void main(字符串[]args){
//使用递归以相反顺序打印列表
int[]numList={
10,
20,
30,
40,
50
};
反向打印(numList);
System.out.println(“”);
}
私有静态void reversePrint(int[]个数){
如果(number.length==0)
回来
int[]a=新的int[numbers.length-1];
对于(int i=0;i
在您的代码中,reversePrint
中的打印语句应该是这样的
System.out.println(numbers[numbers.length - 1] + ""); // for printing from left -> right
递归可能会让很多人感到困惑。让我尽力解释一下
您可能已经知道,递归编程基本上包含一个方法,该方法会重复调用自身,直到满足某个条件为止。注意这一点,
直到满足特定条件
。这对于停止方法的连续执行非常重要,这可能导致StackOverflow异常
好的,说到这里,在递归方法中,您需要做的第一件事是检查是继续执行还是返回控制语句
为了简单起见,让我们仅将10,20作为示例代码的输入
recursivePrint
)方法
打印元素reversePrint
方法中,正如我前面所说的,您通过检查数组中的元素数来检查是继续还是返回控件。这是因为如果数组中没有元素,那么继续程序就没有意义了reversePrint
方法的下一组数组。在第二点中,10,20作为数组中的两个元素。现在,您正在用10作为元素构造新数组(这里的想法是从右到左分离各个元素,以便您可以从右到左打印),并将其传递给reversePrint
方法要记住的事情:仍然留下一些代码来打印最后一个元素(即20
),该元素将在该递归方法调用完成后执行当前数组大小(即1)-1=0)构造新数组,并调用recursivePrint方法并传递此空数组要记住的事情:仍然留下一些代码来打印最后一个元素(即10
),该元素将在该递归方法调用完成后执行
10
20
,如第3点所述希望这有助于你理解。祝你一切顺利。一旦你明白了,与它一起工作会很有趣 以下是您的程序所做工作的说明:
- main方法声明一个int数组,并将对该数组的引用传递给reversePrint。这是第一次调用reversePrint,因此我们将其称为call#1
- reversePrint(调用#1)接收对名为numbers的数组的引用,该数组包含[10,20,30,40,50]。
- numbers.length不是0,因此该方法将继续
- 将创建一个名为A的新数组,其中一个元素比数字短。它由[20,30,40,50]填充
- 当仍然在reversePrint#1中时,我们调用reversePrint(将被称为#2),并引用包含[20,30,40,50]的。但是我们的反向打印1还没有完成。它正在等待调用2的结果
- reversePrint(调用#2)接收对名为numbers的数组的引用,该数组包含[20,30,40,50]。
- numbers.length不是0,因此该方法将继续
- 将创建一个名为A的新数组,其中一个元素比数字短。它由[30,40,50]填充
- 在仍然使用reversePrint#2时,我们调用reversePrint(将被称为#3),并引用包含[30,40,50]的。但是我们的反向打印2还没有完成。它正在等待调用#3的结果
- reversePrint(调用#3)接收对名为numbers的数组的引用,该数组包含[30,40,50]。
- numbers.length不是0,因此该方法将继续
- 将创建一个名为A的新数组,其中一个元素比数字短。它由[40,50]填充
- 当仍然在reversePrint#3中时,我们调用reversePrint(将被称为#4),并引用包含[40,50]的。但是我们的反向打印3还没有完成。它正在等待调用4的结果
- reversePrint(调用#4)接收对名为numbers的数组的引用,该数组包含[40,50]。
- numbers.length不是0,因此该方法将继续
- 将创建一个名为A的新数组,其中一个元素比数字短。它由[50]填充
- 当仍然在reversePrint#4中时,我们调用reversePrint(将被称为#5),并引用包含[50]的。但是我们的反向打印4还没有完成。它正在等待呼叫5的结果