關於遞迴與非遞迴一些想法

2021-10-11 20:59:02 字數 775 閱讀 4833

現在很多公司面試的時候經常會同時考察一道題目的遞迴與非遞迴做法,往往遞迴做法能夠一氣呵成,但是非遞迴方法卻很容易卡殼。我想大概是因為遞迴方法,更符合我們的思維邏輯、**也更簡潔。不像非遞迴方法,通常需要我們手動借助其它資料結構作為臨時儲存。但是遞迴方法,在執行的過程中也在不斷的建立資料結構儲存中間量,只是這個過程我們是看不見的。

leetcode 226翻轉二叉樹

遞迴方法:深度優先遍歷,二叉樹的後序遍歷

treenode*

inverttree

(treenode* root)

可以看到每次遞迴傳遞的形參是左右子樹,所以如果使用非遞迴我們需要儲存的就是當前節點的左右子樹。

非遞迴方法:

上面遞迴方法用的是深度優先遍歷,現在我們來考慮一下廣度優先遍歷的方法。二叉樹的層序遍歷正好對應廣度優先遍歷,借助queue儲存每層節點。

treenode*

inverttree

(treenode* root)

return root;

}

那深度優先遍歷能不能用非遞迴的方法實現呢?

利用了stack作為儲存結構,使用前序遍歷的方法。

treenode*

inverttree

(treenode* root)

return root;

}

在使用深度優先遍歷的時候,通常使用stack儲存,而廣度優先遍歷更傾向於使用queue。

遞迴學習的一些錯誤總結與想法

1.找到停止遞迴的條件 2.找到每一層遞迴之間的聯絡 問題1 將多層迴圈簡化 找出從自然數1 2 m中任取k 個數的所有組合。例如m 5,k 3 案例 輸入5 3 的時候 5 35 4 3 5 4 2 5 4 1 5 3 2 5 3 1 5 2 1 4 3 2 4 3 1 4 2 1 3 2 1 分...

關於遞迴的一些感悟

前些天筆試思科時碰到了一道c的遞迴題目,當時一直糾結在退出遞迴時,其輸出應該只有最後一次printf吧。好吧,我承認我真的很菜,不過我現在弄明白了,遞迴說白了就是自己呼叫自己,當遞迴深度條件不滿足時就退出了遞迴,關鍵點在於退出遞迴後的函式是如何返回的。其實我們可以把遞迴認為是幾個函式在一層層的呼叫,...

關於遞迴的一些思考

遞迴函式一般有兩種模式,請看下面。include define cutoff 3 void swap int a,int b void insertionsort int array,int len else array j 1 temp int median3 int a,int left,int...