Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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 递归vs循环?_Java - Fatal编程技术网

Java 递归vs循环?

Java 递归vs循环?,java,Java,有人能解释一下这两种方法的区别吗 方法1 public void run(){ run(); } 方法2 public void run(){ while(true){ } } 示例1是一个永不停止调用自身的方法。每次调用该方法时,都会向callstack添加一个新的帧,直到出现StackOverflowerError 示例2是一个无限循环。该方法只被添加到调用堆栈中一次。好吧,递归方法最终会崩溃。当使用递归时,在程序运行到无法显示该方法的大小之前,只能执行一定

有人能解释一下这两种方法的区别吗

方法1

public void run(){
    run();
}
方法2

public void run(){
   while(true){

   }    
}

示例1是一个永不停止调用自身的方法。每次调用该方法时,都会向callstack添加一个新的帧,直到出现StackOverflowerError


示例2是一个无限循环。该方法只被添加到调用堆栈中一次。

好吧,递归方法最终会崩溃。当使用递归时,在程序运行到无法显示该方法的大小之前,只能执行一定的级别

使用while-true循环,而不需要任何其他代码永远运行,因为不再有对另一个方法的调用,所以您不再对堆栈执行任何操作

递归一次又一次地调用同一个方法,这需要“空间”来放置该方法(就像一堆方法),一旦堆太大,程序就会退出。使用递归有一些优点,但通常循环更合适


(即使是while-true循环,也可以以“break”终止)

通常,Java中的每个线程都有一个称为调用堆栈的东西。每个方法的执行都会进入堆栈,如果一个方法执行另一个方法,然后再执行另一个方法,那么调用堆栈上的方法就很少了

RandomObject.method1().method2().method3()

将为您提供一堆:

方法3()

方法2()

方法1()

问题是堆栈的空间有限,递归会很快将其填满,从而导致令人讨厌的StackOverFlow异常

就你的情况来看

run().run().run()(..)

所以stack看起来:

(……)

运行()

运行()

运行()


第二个选项在调用堆栈上只有一个方法,它将无限循环而不会崩溃。

1个方法将被递归调用


第二个方法将被称为一种类型,但它将在循环无限次时被卡在内部。它不会从循环中出来。

可能的重复一个是无限递归的,另一个是无限循环?看到这个可能的重复谢谢大家,但我认为它更复杂,我会给出更详细的答案。但是我知道这是最基本的方法StackOverflowerError会出现你能解释一下异常和错误之间的区别吗?在Java中,异常是应用程序可以恢复的东西。开发人员应该捕获异常。错误是一种无法恢复的情况,不应被捕获。