Java 当方法调用自身的return语句时会发生什么?递归。

Java 当方法调用自身的return语句时会发生什么?递归。,java,recursion,Java,Recursion,所以我在教程的帮助下编写了这个简单的代码。经历了这一切,我不太确定faktortall-1*高的回报会发生什么 在return语句中,该方法调用自身并返回一个值。先发生什么?它是先调用自身,还是先返回值,还是两者同时发生 当它返回值时会发生什么 package enkelrekursjon1; public class Enkelrekursjon1 { public static void main(String[] args) { System.out.print

所以我在教程的帮助下编写了这个简单的代码。经历了这一切,我不太确定faktortall-1*高的回报会发生什么

在return语句中,该方法调用自身并返回一个值。先发生什么?它是先调用自身,还是先返回值,还是两者同时发生

当它返回值时会发生什么

package enkelrekursjon1;

public class Enkelrekursjon1 {

    public static void main(String[] args) {

       System.out.print(faktor(3)); 
    }

    private static int faktor(int tall){
    System.out.print(tall); 
    if (tall != 1){
    return faktor(tall - 1)*tall; 
    }    
    return 1; 
    }

}

它的工作方式与返回值的return语句的工作方式相同:

在本例中,将对表达式求值faktortall-1*toll 该值将返回给调用方 它不可能在计算表达式之前返回,因为没有要返回的值

因此,在您的情况下,如果您有call faktor5,那么您将得到以下调用堆栈:

faktor(5)
   -> calls faktor(4)
         -> calls faktor(3)
               -> calls faktor(2)
                     -> calls faktor(1)
                           -> returns 1
                     -> returns 1 * 2 (i.e. 2)
               -> returns 2 * 3 (i.e. 6)
         -> returns 6 * 4 (i.e. 24)
   -> returns 24 * 5 (i.e. 120)

它的工作方式与返回值的return语句的工作方式相同:

在本例中,将对表达式求值faktortall-1*toll 该值将返回给调用方 它不可能在计算表达式之前返回,因为没有要返回的值

因此,在您的情况下,如果您有call faktor5,那么您将得到以下调用堆栈:

faktor(5)
   -> calls faktor(4)
         -> calls faktor(3)
               -> calls faktor(2)
                     -> calls faktor(1)
                           -> returns 1
                     -> returns 1 * 2 (i.e. 2)
               -> returns 2 * 3 (i.e. 6)
         -> returns 6 * 4 (i.e. 24)
   -> returns 24 * 5 (i.e. 120)

这是一个递归结构。它使用条件

if(tall != 1)
作为基本情况。因此,该方法将通过并做一些工作,检查高度是否等于1,如果不等于1,它将通过并再次对数据进行操作。依此类推,直到基本情况满足tall==1


希望这有帮助这是一个递归结构。它使用条件

if(tall != 1)
作为基本情况。因此,该方法将通过并做一些工作,检查高度是否等于1,如果不等于1,它将通过并再次对数据进行操作。依此类推,直到基本情况满足tall==1


希望这有助于

首先,如果条件为true,该方法将调用自身。该方法仅在高度达到1时返回。

首先,如果条件为true,该方法将调用自身。该方法只有在tall达到1时才会返回。

我自己也很想知道,知道它的最好方法是让程序找到它,所以我修改了您的代码以查看实际发生的情况。这是我修改的代码,我用你的母语评论和写的,我想我们生活在同一个国家。呃,我叫诺尔斯克狗。哈哈

public class EnkelRekursjon1 {

    private static String funksjonNavn= "";
    private static int resultat=0;
    public static void main(String[] args) {

        int tall = 3; 
       System.out.print(tall+"! = "+faktor(3)); // resultat printes etter rekursjon 
    }

    private static int faktor(int tall){
    funksjonNavn="Faktor("+tall+")"; 
    System.out.println(tall);
    //finn hvilken funksjon vi er. 
    System.out.println("Funksjonen kaller "+ funksjonNavn);
    if (tall != 1){
        resultat= faktor(tall - 1)*tall; 
        System.out.println("Reusltatet er "+ resultat);
        return resultat; 
    }
    System.out.println("-------------------------------");
    //finn resultat for hver "rekursjon"
    System.out.println("Reusltatet er "+ (resultat+1));
    //blir 1* 0 her tror jeg, så funksjonen returnerer 1 istedenfor 0   
        return 1; 
    }

}
结果如下:

如果您想手动评估它,它将如下所示

faktor(5) = faktor(4)*5
我们将得到faktor4的值,它是这样的:

faktor(4) = faktor(3)*4
我们将对其余的faktorint Toll做同样的处理,直到条件为假

faktor(3) = faktor(2)*3 
faktor(2) = faktor(1)*2
faktor1将返回1,因为高度等于1,因此条件为false。将faktor1替换为1

我们得到:

faktor(2) = 1*2 =2
用2代替faktor2,我们得到

faktor(3)= 2 * 3 = 6
用6代替faktor3,我们得到

faktor(4)= 6*4 = 24
最后,我们得到:

faktor(5) = 24*5 = 120
我希望这次足够清楚


我希望我已经回答了你的问题。如果您还有其他问题,请随时提问。Ha ein fin dag:

我自己也很想知道,最好的办法是让程序找到它,所以我修改了你的代码,看看实际发生了什么。这是我修改的代码,我用你的母语评论和写的,我想我们生活在同一个国家。呃,我叫诺尔斯克狗。哈哈

public class EnkelRekursjon1 {

    private static String funksjonNavn= "";
    private static int resultat=0;
    public static void main(String[] args) {

        int tall = 3; 
       System.out.print(tall+"! = "+faktor(3)); // resultat printes etter rekursjon 
    }

    private static int faktor(int tall){
    funksjonNavn="Faktor("+tall+")"; 
    System.out.println(tall);
    //finn hvilken funksjon vi er. 
    System.out.println("Funksjonen kaller "+ funksjonNavn);
    if (tall != 1){
        resultat= faktor(tall - 1)*tall; 
        System.out.println("Reusltatet er "+ resultat);
        return resultat; 
    }
    System.out.println("-------------------------------");
    //finn resultat for hver "rekursjon"
    System.out.println("Reusltatet er "+ (resultat+1));
    //blir 1* 0 her tror jeg, så funksjonen returnerer 1 istedenfor 0   
        return 1; 
    }

}
结果如下:

如果您想手动评估它,它将如下所示

faktor(5) = faktor(4)*5
我们将得到faktor4的值,它是这样的:

faktor(4) = faktor(3)*4
我们将对其余的faktorint Toll做同样的处理,直到条件为假

faktor(3) = faktor(2)*3 
faktor(2) = faktor(1)*2
faktor1将返回1,因为高度等于1,因此条件为false。将faktor1替换为1

我们得到:

faktor(2) = 1*2 =2
用2代替faktor2,我们得到

faktor(3)= 2 * 3 = 6
用6代替faktor3,我们得到

faktor(4)= 6*4 = 24
最后,我们得到:

faktor(5) = 24*5 = 120
我希望这次足够清楚


我希望我已经回答了你的问题。如果您还有其他问题,请随时提问。HAEIN fin dag:

在返回之前,它是否必须循环通过每个faktortall-1*高?“我还不明白。”戴维兰德:你说的在它被命名之前是什么意思?在你被称为什么之前?你的评论很不清楚。。。您是否尝试过逐步调试代码,或添加日志记录?这些可能是理解发生了什么的最简单的方法。我的意思是我很抱歉。我编辑。是的,我试着一步一步地检查我的代码,但有一点我误解了,这不正确。@DavidLund:从你的评论中不清楚你不理解什么,或者你的意思是什么,这不正确不幸的是:如果你输入5,好的,它打印出5,这是可以的,然后返回20?5-1*5到哪里?然后用数字4再次调用自己并打印出4。在返回之前,它是否必须循环遍历每个faktortall-1*高?“我还不明白。”戴维兰德:你说的在它被命名之前是什么意思?在你被称为什么之前?你的评论
很不清楚。。。您是否尝试过逐步调试代码,或添加日志记录?这些可能是理解发生了什么的最简单的方法。我的意思是我很抱歉。我编辑。是的,我试着一步一步地检查我的代码,但有一点我误解了,这不正确。@DavidLund:从你的评论中不清楚你不理解什么,或者你的意思是什么,这不正确不幸的是:如果你输入5,好的,它打印出5,这是可以的,然后返回20?5-1*5到哪里?然后再次用数字4呼叫自己并打印出4。哈,维博尔·贝格,我是挪威人,såkult!我想我会试着看一段youtube视频,看看会发生什么。希望有人能帮我画出来。。我不确定,但结果的截图是否很不清楚?顺便说一句,在påfb之前,jeg har lag deg。这是我的荣幸。塔克:屏幕截图有点不清楚,但不是什么大问题,因为我可以用你的代码自己打印出来,但很明显,其中涉及到堆栈,所有这些,在幕后有一些魔力,所以我不确定书面解释是否有帮助。当然我可以把你加入facebookJa,vi bor begge I norge,såkult!我想我会试着看一段youtube视频,看看会发生什么。希望有人能帮我画出来。。我不确定,但结果的截图是否很不清楚?顺便说一句,在påfb之前,jeg har lag deg。这是我的荣幸。塔克:屏幕截图有点不清楚,但不是什么大问题,因为我可以用你的代码自己打印出来,但很明显,其中涉及到堆栈,所有这些,在幕后有一些魔力,所以我不确定书面解释是否有帮助。当然,我可以在facebook上添加你