[英]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.