重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這個函數是遞歸的:
十載專注成都網站制作,成都企業網站建設,個人網站制作服務,為大家分享網站制作知識、方案,網站設計流程、步驟,成功服務上千家企業。為您提供網站建設,網站制作,網頁設計及定制高端網站建設服務,專注于成都企業網站建設,高端網頁制作,對酒店設計等多個行業,擁有多年的網站運維經驗。
struct stockRecord* deleteGEMStock(struct stockRecord* list)
{
struct stockRecord *p = list, *tmp;
if(!list) return NULL;
if(list-code = 8000 list-code = 8999){
/* Delete head node */
tmp = list;
list=tmp-next;
free(tmp);
list = deleteGEMStock(list);
}else{ /* to find a middle node */
while(p-next !(p-next-code = 8000 p-next-code = 8999))
p = p-next;
if(!p-next) /* delete ok */
return list;
else{
/* Delete p-next */
tmp = p-next;
p-next = tmp-next;
free(tmp);
list = deleteGEMStock(list);
}
}
}
int findf( int n ){
int a,b,c;
b = n % 2;
c = 0;
if ( n4){
if (b==c){
a=findf( n-1 ) + findf( n-3 );
}
else{
a=findf( n-2 ) + findf( n-4 );
}
return a;
}
else if ( n 0){
return -1;
}
else{
return 1;
}
}
標個記號準備上傳對大神的源碼分析。好了,我分析了上樓大神的代碼實現,具體參考他的代碼,分享下。注:可以看看《算法精解》Kyle Loudon著 ?或者《數據結構》?主編 安訓國?他們說的堆棧原理。
#include?stdio.h
char*?dg(char*?instr,?char*?outstr,?char*?outstr2)?
{
if?(*instr?==?0)?
{
*outstr?=?0;
return?outstr2;
}
*(outstr?+?1)?=?*instr;
outstr?=?dg(instr?+?1,?outstr?+?2,?outstr2);
/*?下兩句一直不執行,直到outstr?=?dg(instr?+?5,?outstr?+?10,?outstr2)返回后才執行,其后不斷執行后三句!*/
*outstr?=?*instr?-?32;
return?outstr?+?2;
}
int?main()
{
char?buf[50];
dg("aybdx",?buf,?buf);
puts(buf);
return?0;
}
我給你舉個簡單的例子你就明白了,你可以假設n=3
然后代入這個函數,a(3)=a(2)+5;而a(2)=a(1)+5;a(1)=1
所以最后就是a(3)=1+5+5=11…
同理你可以算出a(10)=1+5*9=46
滿意請采納
遞歸(recursion)就是子程序(或函數)直接調用自己或通過一系列調用語句間接調用自己,是一種描述問題和解決問題的基本方法。
遞歸通常用來解決結構自相似的問題。所謂結構自相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規模小。實際上,遞歸是把一個不能或不好解決的大問題轉化為一個或幾個小問題,再把這些小問題進一步分解成更小的問題,直至每個小問題都可以直接解決。因此,遞歸有兩個基本要素:
(1)邊界條件:確定遞歸到何時終止,也稱為遞歸出口。
(2)遞歸模式:大問題是如何分解為小問題的,也稱為遞歸體。遞歸函數只有具備了這兩個要素,才能在有限次計算后得出結果
漢諾塔問題:對漢諾塔問題的求解,可以通過以下3個步驟實現:
(1)將塔上的n-1個碟子借助塔C先移到塔B上;
(2)把塔A上剩下的一個碟子移到塔C上;
(3)將n-1個碟子從塔B借助塔A移到塔C上。
在遞歸函數中,調用函數和被調用函數是同一個函數,需要注意的是遞歸函數的調用層次,如果把調用遞歸函數的主函數稱為第0層,進入函數后,首次遞歸調用自身稱為第1層調用;從第i層遞歸調用自身稱為第i+1層。反之,退出第i+1層調用應該返回第i層。采用圖示方法描述遞歸函數的運行軌跡,從中可較直觀地了解到各調用層次及其執行情況,具體方法如下:
(1)寫出函數當前調用層執行的各語句,并用有向弧表示語句的執行次序;
(2)對函數的每個遞歸調用,寫出對應的函數調用,從調用處畫一條有向弧指向被調用函數入口,表示調用路線,從被調用函數末尾處畫一條有向弧指向調用語句的下面,表示返回路線;
(3)在返回路線上標出本層調用所得的函數值。n=3時漢諾塔算法的運行軌跡如下圖所示,有向弧上的數字表示遞歸調用和返回的執行順序
三、遞歸函數的內部執行過程
一個遞歸函數的調用過程類似于多個函數的嵌套的調用,只不過調用函數和被調用函數是同一個函數。為了保證遞歸函數的正確執行,系統需設立一個工作棧。具體地說,遞歸調用的內部執行過程如下:
(1)運動開始時,首先為遞歸調用建立一個工作棧,其結構包括值參、局部變量和返回地址;
(2)每次執行遞歸調用之前,把遞歸函數的值參和局部變量的當前值以及調用后的返回地址壓棧;
(3)每次遞歸調用結束后,將棧頂元素出棧,使相應的值參和局部變量恢復為調用前的值,然后轉向返回地址指定的位置繼續執行。
上述漢諾塔算法執行過程中,工作棧的變化如下圖所示,其中棧元素的結構為(返回地址,n值,A值,B值,C值),返回地址對應算法中語句的行號,分圖的序號對應圖中遞歸調用和返回的序號
我可以幫助你,你先設置我最佳答案后,我百度Hii教你。