c語言什麼是遞迴方法,C語言什麼是遞迴方法?

2021-05-04 18:27:56 字數 2031 閱讀 1975

1樓:

程式設計裡面估計最讓人摸不著頭腦的基本演算法就是遞迴了。很多時候我們看明白乙個複雜的遞迴都有點費時間,尤其對模型所描述的問題概念不清的時候,想要自己設計乙個遞迴那麼就更是有難度了。今天我也花費了半個小時來搞明白二叉樹的平衡性的遞迴模型,首先我不明白什麼叫做平衡性,所以花費的時候大部分實在試探理解平衡性的含義。

在搞明白的時候,我突然想到假如讓我來設計,在我知道平衡性的前提下,我是否可以建立如此簡潔的遞迴模型。為此,我遇到的問題是我們到底在什麼情況下適用遞迴模型,並且遞迴模型如何建立。

數學都不差的我們,第一反應就是遞迴在數學上的模型是什麼。畢竟我們對於問題進行數學建模比起**建模拿手多了。 (當然如果對於問題很清楚的人也可以直接簡歷遞迴模型了,運用數模做中介的是針對對於那些問題還不是很清楚的人)

自己觀察遞迴,我們會發現,遞迴的數學模型其實就是歸納法,這個在高中的數列裡面是最常用的了。回憶一下歸納法。

歸納法適用於想解決乙個問題轉化為解決他的子問題,而他的子問題又變成子問題的子問題,而且我們發現這些問題其實都是乙個模型,也就是說存在相同的邏輯歸納處理項。當然有乙個是例外的,也就是遞迴結束的哪乙個處理方法不適用於我們的歸納處理項,當然也不能適用,否則我們就無窮遞迴了。這裡又引出了乙個歸納終結點以及直接求解的表示式。

如果運用列表來形容歸納法就是:

步進表示式:問題蛻變成子問題的表示式

結束條件:什麼時候可以不再是用步進表示式

直接求解表示式:在結束條件下能夠直接計算返回值的表示式

邏輯歸納項:適用於一切非適用於結束條件的子問題的處理,當然上面的步進表示式其實就是包含在這裡面了。

這樣其實就結束了,遞迴也就出來了。

遞迴演算法的一般形式:

void func( mode)

else }

最典型的就是n!演算法,這個最具有說服力。理解了遞迴的思想以及使用場景,基本就能自己設計了,當然要想和其他演算法結合起來使用,還需要不斷實踐與總結了。

例如:返回乙個二叉樹的深度:

int depth(tree t)

}判斷乙個二叉樹是否平衡:

int isb(tree t){

if(!t) return 0;

int left=isb(t.left);

int right=isb(t.right);

if( left >=0 && right >=0 && left - right <= 1 || left -right >=-1)

return (left

上面這兩個遞迴的難易程度就不一樣了,第乙個關於深度的遞迴估計只要了解遞迴思想的都可以短時間設計出來,但第二個估計就要長點時間了。純遞迴問題的難易主要糾結於一些條件表示式的構造以及初值的設定(上面的為直接表示式值的設定)。

最後需要補充的是,很多不理解遞迴的人,總認為遞迴完全沒必要,用迴圈就可以實現,其實這是一種很膚淺的理解。因為遞迴之所以在程式中能風靡並不是因為他的迴圈,大家都知道遞迴分兩步,遞和歸,那麼可以知道遞迴對於空間效能來說,簡直就是造孽,這對於追求時空完美的人來說,簡直無法接接受,如果遞迴僅僅是迴圈,估計現在我們就看不到遞迴了。遞迴之所以現在還存在是因為遞迴可以產生無限迴圈體,也就是說有可能產生100層也可能10000層for迴圈。

例如對於乙個字串進行全排列,字串長度不定,那麼如果你用迴圈來實現,你會發現你根本寫不出來,這個時候就要呼叫遞迴,而且在遞迴模型裡面還可以使用分支遞迴,例如for迴圈與遞迴巢狀,或者這節列舉幾個遞迴步進表示式,每乙個形成乙個遞迴。

2樓:千鋒教育

簡單來說就是乙個函式呼叫到了自己,就可以稱為遞迴.下面是簡單的求n!的例子:

#include

#include

int fac(int n)

void main()

3樓:匿名使用者

你把你的函式拆開看,比如,你求5的階乘,那麼你把那個函式,看成多個,你複製出來 func_1至func_n;然後呼叫的時候第i個函式,呼叫第i+1個函式.這相可以實現同樣的功能.

其實遞迴就相當於這多個函式,只是呼叫的時候,都是呼叫它自己,這個時候,就把函式本身看成乙個新的函式.直到函式返回.

請用C語言編寫遞迴函式,C語言 編寫遞迴函式

迴圈實現。include int main printf d t return 0 簡單修改一下就可以變遞迴了。如下。include int fanzhuan int n,int t int main c語言 編寫遞迴函式 可以看看 演算法精解 kyle loudon著 或者 資料結構 主編 安訓國...

C語言應用遞迴呼叫的方法分別求

計算小於某整數的加法 乘法 為真是加,假為乘 最大數 返回值 public double pute bool ctype,int endnum else int sum int n main include stdio.h int sum int num main 用遞迴法寫出1 2 3 100的程...

C語言迴圈結構 迭代,C語言迭代與遞迴比較(舉例)

付費內容限時免費檢視 回答親您好,您的問題我已經看到啦,我需要幾分鐘來為您整理優質的答案希望您能耐心等待 希望回答完您可以給個贊哦!祝您生活愉快 語言中提供四種迴圈,即goto迴圈 while迴圈 do while迴圈和for迴圈。四種迴圈可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不...