熱門話題
#
Bonk 生態迷因幣展現強韌勢頭
#
有消息稱 Pump.fun 計劃 40 億估值發幣,引發市場猜測
#
Solana 新代幣發射平臺 Boop.Fun 風頭正勁
為什麼即使你永遠不會使用它,你也應該學習遞歸?
遞歸解決方案訓練你幾種思維方式:
1. 與其試圖生成解決方案,你通常會從「有效解決方案的結構是什麼」開始,然後向後推導。對於某些問題,向後推導要容易得多。
2. 當你在解決問題時,很容易被所有的「如果」分心。當以遞歸方式解決問題時,你通常被迫「忽略」90%的問題,專注於只讓一部分正確。
3. 在命令式解決方案中,通常會是一個「邊緣」情況,而在遞歸中則是一個「基礎情況」。遞歸思考有時迫使你不忽略邊緣情況。此外,遞歸解決方案大量使用模式匹配,因此你被迫考慮所有可能遇到的情況。
這裡有一個非常好的例子:Leetcode 335 自我交叉(困難問題)。
你在網格上沿著螺旋軌跡移動(即在向北、南、東或西移動一段距離後總是向左轉)。問題是,「給定螺旋中每個‘段’的距離,螺旋是否交叉?」
雖然這個問題的解決方案不需要是一個調用自身的函數,但「好的」解決方案使用了遞歸特性:
1. 如果我們還沒有找到交叉,那麼我們可以假設過去沒有交叉或無效的螺旋。我們還注意到,無論我們是向左、向右、向上還是向下移動都無所謂,因為我們只能向左轉。我們關心的只是之前的段是否與我們的上一次轉向平行,以及它們距離有多遠。
2. 當我們向左轉時,螺旋中可以撞到的「段」數量極其有限,這在螺旋變大時「遞歸」地成立。我們可以忽略很多關於螺旋的過去數據。
3. 在你之前的轉向中,有有限的情況會影響你的邏輯:a) 你是否移動得足夠遠以避免撞到任何東西,b) 如果沒有,你可能會撞到什麼?(也有限)。
Leetcode 困難的煩人之處在於,如果你找到關鍵見解,它們會突然變得簡單。但如果你在遞歸編程中訓練自己,這些關鍵見解會更自然地出現。
這不僅僅是設計調用自身的函數——而是迫使自己以某種方式分解問題,使其可以用調用自身的函數來解決。你能分解問題的方式越多,你找到「啊哈」解決方案的可能性就越大。
顯然,我在我的職業中不需要進行 Leetcode,但我確實需要找到創造性的方法來分解問題,使其變得可理解——而遞歸訓練確實對此有所幫助。

1.67K
熱門
排行
收藏