Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能解释一下java递归是如何工作的吗,特别是在下面的这个程序中?_Java_Recursion - Fatal编程技术网

有人能解释一下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,

下面的每一行代码都做什么?我对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,
        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作为示例代码的输入

  • 首先,main方法为调用递归(
    recursivePrint
    )方法 打印元素
  • reversePrint
    方法中,正如我前面所说的,您通过检查数组中的元素数来检查是继续还是返回控件。这是因为如果数组中没有元素,那么继续程序就没有意义了
  • 接下来,通过减小数组大小(当前数组大小-1),准备传递给
    reversePrint
    方法的下一组数组。在第二点中,10,20作为数组中的两个元素。现在,您正在用10作为元素构造新数组(这里的想法是从右到左分离各个元素,以便您可以从右到左打印),并将其传递给
    reversePrint
    方法要记住的事情:仍然留下一些代码来打印最后一个元素(即
    20
    ),该元素将在该递归方法调用完成后执行
  • 检查数组是否为空,因为我们有10作为元素,使用零元素或空数组(
    当前数组大小(即1)-1=0)构造新数组,并调用recursivePrint方法并传递此空数组要记住的事情:仍然留下一些代码来打印最后一个元素(即
    10
    ),该元素将在该递归方法调用完成后执行
  • 再次检查数组是否为空,因为它现在为空,只需返回到control语句即可。
  • 现在控件返回执行上一步中保留的代码,即 连续打印第4点中的元素
    10
  • 由于控制语句到达了方法的末尾,它返回到打印元素
    20
    ,如第3点所述
  • 它再次到达方法的末尾,并且control语句返回到主方法并打印没有内容的空字符串

  • 希望这有助于你理解。祝你一切顺利。一旦你明白了,与它一起工作会很有趣

    以下是您的程序所做工作的说明:

    • 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的结果