簡體   English   中英

遞歸方法輸出

[英]Recursive method output

有人可以告訴我這段代碼的輸出嗎? 我的理解是,一旦堆棧完成執行,display()方法將開始顯示1,2,3,4,5,但是顯示0,1,2,3,4可以解釋一下這種情況嗎?

package com.test.examples.datastructures.examples.recursive;

public class Recursive {

    public static void main(String args[]) {
        int var = 5;
        recursive(var);
    }

    public static void recursive(int i) {
        System.out.println("i " +i);
        if (i<1) {
            return;
        }
        recursive(i=i-1);
        display(i);
    }

    public static void display(int i) {
        System.out.println(" " +i);
    }
}

在遞歸結束之前, display()不會顯示任何內容。 此時, i<1 ,轉換為i為0。因此,最后一次遞歸調用返回,並且下一個語句將是第一次完成的顯示。 它輸出0。然后從recursive()返回,下一行顯示(1),依此類推。

方法display永遠不會用值5調用,因為前一行從i中的值減去1:

    recursive(i=i-1);
    display(i);

傳遞給下一個遞歸調用的值是i減1 的值。 首先對表達式i-1求值,然后對i進行賦值,然后將通過賦值存儲在i中的值傳遞給遞歸調用。 如果您將其更改為

    recursive(i-1);
    display(i);

那么display方法調用將打印出1到5。請嘗試避免在遞歸函數中對變量進行變異,因為變量通常是不需要的,並且只會引起混淆(無論如何,更改參數值被許多人認為是不好的風格)。 您可以在遞歸方法的方法簽名中在參數i上加上final ,這將防止更改i中的值:

public class Recursive {

    public static void main(String args[]) {
        int var = 5;
        recursive(var);
    }

    public static void recursive(final int i) {
        System.out.println("i " +i);
        if (i<1) {
            return;
        }
        recursive(i-1);
        display(i);
    }

    public static void display(int i) {
        System.out.println(" " +i);
    }
}

還有一種僅依靠副作用來輸出的遞歸方法也很奇怪,您可以這樣做:

import java.util.*;

public class R {

    public static void main(String[] args) {
        System.out.println(r(5));
    }

    public static List r(final int i) {
        if (i < 1) return new ArrayList();
        List list = r(i - 1);
        list.add(i);
        return list;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM