1. 程式人生 > >邏輯Bug:在使用遞迴時的返回問題

邏輯Bug:在使用遞迴時的返回問題

最近練習時寫了個簡單的二叉搜尋樹,find方法採用遞迴,開始是這樣寫的:
public boolean find(int key) {
	if(this.data == key) {
		//System.out.println("true");
		return true;
	} 
	if(key < this.data && this.leftChild != null) {
		leftChild.find(key);
	} else if(this.rightChild != null){
		rightChild.find(key);
	}
	return false;
}
在樹中添加了三個元素50,25,75,發現find(25)返回的總是false。於是我在方法return true之前加了一句System.out.println("true"); 發現可以顯示,這說明return true執行了。斷點進去執行發現,return true以後程式居然還在往下執行!一直執行到最後的return false,於是返回的都是false了。

研究了半天發現,這個return true其實是遞迴執行一次以後的程式的返回值,也就是說其實原來的方法還沒有執行完,只是第一層的遞迴執行完了,而我卻以為整個方法都執行完成了!

修改後的程式碼如下:

public boolean find(int key) {
	
	if(this.data == key) {
		return true;
	} 
	if(key < this.data) {
		if(this.leftChild == null) {
			return false;
		} else {
			return leftChild.find(key);
		}
		
	} else {
		if(rightChild == null){
			return false;
			
		} else {
			return rightChild.find(key);
		}
	}
}
說到底還是對遞迴不熟練造成的!