【问题标题】:What happens when a return statement where method calls itself? Recursion.当方法调用自身的 return 语句时会发生什么?递归。
【发布时间】:2015-07-15 13:54:20
【问题描述】:

所以我在教程的帮助下编写了这个简单的代码。通过它,我不太确定return faktor(tall-1)*tall 会发生什么。

在 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; 
    }

}

【问题讨论】:

    标签: java recursion


    【解决方案1】:

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

    • 对表达式求值(在本例中为 faktor(tall - 1) * tall
    • 值返回给调用者

    它不可能在评估表达式之前返回,因为没有要返回的值。

    所以在你的情况下,如果你调用了faktor(5),你最终会得到一个调用堆栈:

    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)
    

    【讨论】:

    • 在返回之前是否必须遍历每个 faktor(tall-1)*tall?我还没明白。
    • @DavidLund:“在它被调用之前”是什么意思?在 what 之前会被调用?您的评论很不清楚...您是否尝试过逐步调试代码或添加日志记录?这些可能是了解正在发生的事情的最简单方法。
    • 我的意思是退货,对不起。我编辑了。是的,我已经尝试过一步一步地检查我的代码,但是我有一些误解并没有使它正确。
    • @DavidLund:不幸的是,您的 cmets 并不清楚您不理解什么或您所说的“这不正确”是什么意思 :(
    • 如果你输入 5, okey, 打印出 5 就可以了,然后返回 20? (5-1*5)到哪里?并再次用数字 4 调用自身并打印出 4。
    【解决方案2】:

    我自己也对此感到疑惑,而了解它的最佳方法是让程序发现它,因此我修改了您的代码以查看实际发生的情况。这是我修改的代码(我用你的母语评论和写了它,我想我们生活在同一个国家。Er ikke norsk dog。哈哈。)

    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
    

    我们会得到 faktor(4) 的值,它是这样的:

    faktor(4) = faktor(3)*4
    

    我们将对“faktor(int tall)”的其余部分执行相同的操作,直到条件为假。

    faktor(3) = faktor(2)*3 
    faktor(2) = faktor(1)*2
    

    faktor(1) 将返回 1,因为 tall 等于 1(因此,条件为假)。用 1 代替 faktor(1),

    我们得到:

    faktor(2) = 1*2 =2
    

    用 2 代替 faktor(2),我们得到

    faktor(3)= 2 * 3 = 6
    

    用 6 代替 faktor(3),我们得到

    faktor(4)= 6*4 = 24
    

    最后,我们得到:

    faktor(5) = 24*5 = 120
    

    希望这次够清楚

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

    【讨论】:

    • Ja,vi bor begge i norge,så kult!我想我会尝试观看 youtube 视频,看看会发生什么。希望有人能帮我画出来。
    • øhmm.. 我不确定,但结果的屏幕截图是不是很不清楚?顺便说一句,jeg har lagt deg til på fb。 håper vi kan bli venner。塔克 :)
    • 截图有点不清楚,但不是什么大问题,因为我可以自己用你的代码打印出来,但显然其中涉及到堆栈,所有这些,有一些魔力在幕后,所以我不确定书面解释是否有帮助。当然我可以在 facebook 上加你
    【解决方案3】:

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

    if(tall != 1)
    

    作为基本情况。所以这个方法会遍历并做一些工作,检查 tall 是否等于 1,如果不等于 1,它将遍历并再次对数据进行操作。以此类推,直到满足基本情况(tall==1)

    希望对你有帮助

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-23
        • 2017-07-28
        • 2020-01-04
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2010-12-07
        • 2018-09-10
        相关资源
        最近更新 更多