算法思想:層次遍歷目前最普遍用的就是隊列的那種方式,不是遞歸,但是用到while循環(huán),既然題目要求用遞歸,可以用遞歸實現(xiàn)該while循環(huán)功能。算法如下:
淇濱ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
void TransLevele(Tree *r)
{
if (r==NULL)
{
return ;
}
printf("%c",r-ch);
if (r-left != NULL)
{
InsertQueue(r-left);
}
if (r-right != NULL)
{
InsertQueue(r-right);
}
Tree *t = DeleteQueue();
TransLevele(t);
}
//測試程序,創(chuàng)建樹輸入例如ABD##E##C##,根左右創(chuàng)建的方式。
如下代碼是測試通過的。
#include "stdlib.h"
#define MAX 100
typedef int Element;
typedef struct tree
{
Element ch;
struct tree *left;
struct tree *right;
}Tree;
typedef struct queue
{
Tree *a[MAX];
int front;
int rear;
}Queue;
Queue Qu;
void Init();
int InsertQueue(Element ch);
Tree *DeleteQueue();
void CreateTree(Tree **r);
void TransLevele(Tree *r);
void PrintTree(Tree *r);
int main()
{
Tree *r=NULL;
CreateTree(r);
PrintTree(r);
printf("\n");
TransLevele(r);
return 0;
}
void Init()
{
int i=0;
for (i=0; iMAX; i++)
{
Qu.a[i] = NULL;
}
Qu.front = 0;
Qu.rear = 0;
}
int InsertQueue(Tree *r)
{
if ( (Qu.rear+1)%MAX == Qu.front)
{
printf("Queue full!");
return 0;
}
Qu.a[Qu.rear] = r;
Qu.rear = (Qu.rear+1)%MAX;
return 1;
}
Tree *DeleteQueue()
{
if (Qu.front == Qu.rear)
{
printf("Queue empty");
return NULL;
}
Tree *t=NULL;
t = Qu.a[Qu.front];
Qu.front = (Qu.front+1)%MAX;
return t;
}
void CreateTree(Tree **r)
{
Element ch;
ch=getchar();
if (ch=='#')
{
(*r)=NULL;
return ;
}
*r = (Tree *)malloc(sizeof(Tree));
(*r)-ch = ch;
CreateTree(((*r)-left));
CreateTree(((*r)-right));
}
void PrintTree(Tree *r)
{
if (r==NULL)
{
return ;
}
printf("%c",r-ch);
PrintTree(r-left);
PrintTree(r-right);
}
void TransLevele(Tree *r)
{
if (r==NULL)
{
return ;
}
printf("%c",r-ch);
if (r-left != NULL)
{
InsertQueue(r-left);
}
if (r-right != NULL)
{
InsertQueue(r-right);
}
Tree *t = DeleteQueue();
TransLevele(t);
}
我一步步的給你講,就會懂啦:
首先hanoi函數(shù)如果把當中的move函數(shù)給去掉,就變成了:
void
hanoi(int
n,
char
one
,
char
two,
charthree){
if(n
==
1)
printf("%c-%c\n",
one,
three);
else
{
hanoi(n
-
1,
one,
three,
two);
printf("%c-%c\n",
one,
three);
hanoi(n
-
1,
two,
one,
three);
}}也就是把move(one,three),變成了printf("%c-%c\n",
one,
three);。少了一個函數(shù),更加清晰
所以這里的hanoi函數(shù)就有了執(zhí)行的內(nèi)容:printf
下面以3個盤子為例進行模擬計算機的執(zhí)行過程:
1、hanoi(3,A,B,C),開始了這步,進入第一層函數(shù),計算機在函數(shù)中會進行自我的再次調(diào)用(第7行代碼)
2、(第7行):hanoi(2,A,C,B),于是這又是一個新的hanoi函數(shù),這里我把它成為第二層函數(shù)
同樣執(zhí)行到第7行,卡住了,再次一次自我的調(diào)用
3、(進入第三層函數(shù)):hanoi(1,A,B,C),這里的第三層n=1,所以在第四行就顯示出了"A-C",至此,第三層函數(shù)結(jié)束,回到調(diào)用他的第二層函數(shù)
4、在第二層當中,繼續(xù)第8行的內(nèi)容,所以顯示出"A-B",繼續(xù)運行,到第9行,開始了有一次自我調(diào)用
5、把她稱為貳號第三層函數(shù)吧。。。hanoi(1,B,A,C),和第3步類似,這一層函數(shù)顯示出了"B-C",然后結(jié)束函數(shù),返回調(diào)用它的第二層函數(shù)
6、第二層函數(shù)執(zhí)行完畢,返回調(diào)用它的第一層函數(shù)
7、第一層函數(shù)中執(zhí)行到第8行,顯示出"A-C",然后執(zhí)行第9行:hanoi(2,B,A,C)
............
如果看到了這里理清楚了關(guān)系就會懂啦,接下來還有一半,如果都寫下來就太復雜了-。-
你所說的空函數(shù)是指沒有返回值,但是這里利用的是電腦調(diào)用函數(shù)的那種關(guān)系來解決的問題,比如上面的3步,會自動返回到第二層函數(shù)并繼續(xù)
還可以這樣理解漢諾塔,漢諾塔其實是將復雜的問題簡單化,
先不管他有多少個盤子從A到C,我只把它視作3步
就像上面那樣找個例子,反復的按照代碼模擬計算機運行,過個五次六次,就會懂啦
遞歸(recursion)就是子程序(或函數(shù))直接調(diào)用自己或通過一系列調(diào)用語句間接調(diào)用自己,是一種描述問題和解決問題的基本方法。
遞歸通常用來解決結(jié)構(gòu)自相似的問題。所謂結(jié)構(gòu)自相似,是指構(gòu)成原問題的子問題與原問題在結(jié)構(gòu)上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規(guī)模小。實際上,遞歸是把一個不能或不好解決的大問題轉(zhuǎn)化為一個或幾個小問題,再把這些小問題進一步分解成更小的問題,直至每個小問題都可以直接解決。因此,遞歸有兩個基本要素:
(1)邊界條件:確定遞歸到何時終止,也稱為遞歸出口。
(2)遞歸模式:大問題是如何分解為小問題的,也稱為遞歸體。遞歸函數(shù)只有具備了這兩個要素,才能在有限次計算后得出結(jié)果
漢諾塔問題:對漢諾塔問題的求解,可以通過以下3個步驟實現(xiàn):
(1)將塔上的n-1個碟子借助塔C先移到塔B上;
(2)把塔A上剩下的一個碟子移到塔C上;
(3)將n-1個碟子從塔B借助塔A移到塔C上。
在遞歸函數(shù)中,調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù),需要注意的是遞歸函數(shù)的調(diào)用層次,如果把調(diào)用遞歸函數(shù)的主函數(shù)稱為第0層,進入函數(shù)后,首次遞歸調(diào)用自身稱為第1層調(diào)用;從第i層遞歸調(diào)用自身稱為第i+1層。反之,退出第i+1層調(diào)用應(yīng)該返回第i層。采用圖示方法描述遞歸函數(shù)的運行軌跡,從中可較直觀地了解到各調(diào)用層次及其執(zhí)行情況,具體方法如下:
(1)寫出函數(shù)當前調(diào)用層執(zhí)行的各語句,并用有向弧表示語句的執(zhí)行次序;
(2)對函數(shù)的每個遞歸調(diào)用,寫出對應(yīng)的函數(shù)調(diào)用,從調(diào)用處畫一條有向弧指向被調(diào)用函數(shù)入口,表示調(diào)用路線,從被調(diào)用函數(shù)末尾處畫一條有向弧指向調(diào)用語句的下面,表示返回路線;
(3)在返回路線上標出本層調(diào)用所得的函數(shù)值。n=3時漢諾塔算法的運行軌跡如下圖所示,有向弧上的數(shù)字表示遞歸調(diào)用和返回的執(zhí)行順序
三、遞歸函數(shù)的內(nèi)部執(zhí)行過程
一個遞歸函數(shù)的調(diào)用過程類似于多個函數(shù)的嵌套的調(diào)用,只不過調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù)。為了保證遞歸函數(shù)的正確執(zhí)行,系統(tǒng)需設(shè)立一個工作棧。具體地說,遞歸調(diào)用的內(nèi)部執(zhí)行過程如下:
(1)運動開始時,首先為遞歸調(diào)用建立一個工作棧,其結(jié)構(gòu)包括值參、局部變量和返回地址;
(2)每次執(zhí)行遞歸調(diào)用之前,把遞歸函數(shù)的值參和局部變量的當前值以及調(diào)用后的返回地址壓棧;
(3)每次遞歸調(diào)用結(jié)束后,將棧頂元素出棧,使相應(yīng)的值參和局部變量恢復為調(diào)用前的值,然后轉(zhuǎn)向返回地址指定的位置繼續(xù)執(zhí)行。
上述漢諾塔算法執(zhí)行過程中,工作棧的變化如下圖所示,其中棧元素的結(jié)構(gòu)為(返回地址,n值,A值,B值,C值),返回地址對應(yīng)算法中語句的行號,分圖的序號對應(yīng)圖中遞歸調(diào)用和返回的序號
我可以幫助你,你先設(shè)置我最佳答案后,我百度Hii教你。
當前題目:c語言遞歸函數(shù)顯示層次 c語言遞歸函數(shù)是什么意思
標題路徑:http://jinyejixie.com/article14/ddcdgde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、ChatGPT、網(wǎng)站改版、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)