遞迴呼叫的返回值

2021-07-28 17:50:59 字數 1496 閱讀 3496

在這之前我不少用遞迴函式,但一直沒有真正弄明白遞迴函式的返回值的原理,為了更好的說明問題我寫乙個平衡二叉樹演算法利用遞迴演算法查詢值的原始碼如下:
package com.cph.interviwe;

public

class node

public

node( )

public boolean store(int

value)else

} if(this.value

}if(this.value==value)else

}public boolean find(int

value)else

}else

if(this.value

}return b;

}public

static

void

main(string args)

}

這個是二叉樹中的儲存資料和查詢資料的方法,如果沒有多加注意,可能你會覺得控制台那輸出的是false,因為建立的二叉樹中並沒有存在9資料,但事實上控制台上輸出的是true。

我們現在修改一下main方法,如下(注釋了一行**)

public

static

void

main(string args)

僅僅注釋了一行**,控制台那卻輸出是false。

如果你感到很疑惑,說明你對遞迴函式的返回值的理解不夠透徹。我們分析一下**,在find()方法中如果我們在二叉樹中該節點找到輸入的資料函式返回是true,否則返回的是false。這句話是沒有問題,注意我說的是二叉樹中的該節點。那為什麼該節點返回來的值在後面就改變了呢?其實該函式的b並沒有改變,只是在system.out.println(node.find(9))中返回來的並不是該節點的b,而是遞迴呼叫的最高層的那個b。

說了上面那個也許你開始有點懵懂了,對應我們上面那兩個例項分析:

①第乙個為什麼輸入的是true,因為當程式檢查根結點的值為7,而輸入的是9,比7大。所以來到7的有節點,有節點的值為8,還是小於9,繼續找8的右節點,8的有節點為空。所以返回false,注意該返回後,是來到根結點7的那個find方法,而7中的find返回來的是7中的b,而7中的b為true,所以system.out輸出來的是true.

②第二個當接受的資料為9,比7大,所以查詢7的右節點,而7的右節點為空,b為false。而該find函式外面沒有再巢狀find了,所以輸出來的是false。

如果想使結果一層一層傳上來,我們該怎麼做?其實很簡單,就是在遞迴呼叫前面加上return即可。

public  boolean find(int

value)else

}else

if(this.value

}return b;

}

js遞迴呼叫注意return返回值

let depth 0function fc num const res fc 5 console.log res 2 我們可以使用迭代迴圈,去改寫遞迴,每次都去計算值,而不是將函式儲存在記憶體中等待呼叫,從而避免堆疊溢位。function fc num console.log res fc 6 f...

return返回值呼叫

函式中的返回值 函式中的返回值是由return來決定的 函式中可不可返回兩個值?可以函式中沒有return就沒有返回值,呼叫函式得到的結果就是none 函式中返回多個值,直接寫在return後面用逗號隔開就可以的 當函式執行到return的之後,那麼會直接跳出函式,返回結果 def func a,b...

函式 引數 返回值 遞迴

函式 函式表示式就是忽略名字 1 函式宣告 function onname 2 命名函式表示式 var test function abc 3 匿名函式表示式 var demo function 因為匿名函式表示式比較常用,所以說函式表示式一般是指匿名函式表示式 引數 形式引數 沒有實際傳值 實際引...