當前位置:首頁 » 編程語言 » C語言遞歸函數調用返回
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

C語言遞歸函數調用返回

發布時間: 2022-07-27 13:36:15

c語言遞歸函數

遞歸(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教你。

Ⅱ c語言遞歸函數的問題

通過分析這個代碼,建立了如圖的樹。

1、當進去A時,num = 1;

2、接著往左進去B,num = 2;

3、往B左邊及右邊因為是NULL直接返回2處,再返回到1處;

4、接著往A右邊C,此時num=3,這里把返回值C壓入寄存器RAX,代碼返回到A,但是最上層A處沒有接收返回值,此時A退出,main函數從RAX取出返回值賦值給變數a。

這就是整個調用過程,這里返回值並不是最上層的返回值,是C的返回值,之所以能得到這個值是這個程序沒有同步其它地方使用了RAX寄存器,它的值沒有被修改。

Ⅲ c語言遞歸調用怎麼返回第一次遞歸調用


討論下:遞歸是利用棧來實現的。被調函數地址首先存入棧,存在棧底部紅色部分,然後f(5)入棧,f(4)、f(3)、f(2)、f(1)依次入棧,由於當n=1時候,f(1)可以被求解,f(1)出棧,棧頂指針top--,依次解析f(2)、f(3)、f(4)、f(5),最後返回被調函數地址。

Ⅳ c語言函數的遞歸調用

遞歸有一個堆棧的概念,那就意味著他是一個反理解的過程:就象數學遞推一樣,你知道第一項,第二項,又知道通項公式,那你就可以知道任何一項。
然後你看代碼:fun(0)==0,fun(1)==1;是告訴你一二項。
fun(n)==fun(n-1)+fun(n-2);是告訴你通項公式。那麼,你就可以知道任何一項。你這樣理解就差不多了,具體機器是怎麼操作的,那很復雜的,也不需要明白!!!!

Ⅳ C語言中自定義函數中遞歸調用是怎樣工作的

假如輸入3
y=ff(n);
//第一次調用
執行else
f=ff(n-1)*n;
//f=ff2*3
ff2遞歸
執行else
f=ff(n-1)*n;
//f=ff1*2
ff1遞歸
執行else
if(n==0||n==1)
f=1;
f=1
跳過else
f=ff(n-1)*n;
//兩個else並列的不再執行第二個
執行return(f);
從printf("%d!=%ld",n,y);向下執行主程序

Ⅵ 講一下c語言中遞歸函數的使用方法

相當於循環,要有判斷條件,傳遞進去的參數要變化,滿足條件調用自身,不滿足條件就開始一層一層返回。簡單例子:
int
f(int
i){
int
sum=0;
if(i>0)
sum+=f(i-1);
return
sum;
}
main(){
int
a=10;
printf("%d",f(a));
}

Ⅶ C語言 函數返回值遞歸調用

int
fun(int
n)
定義函數fun
{if
(n>1)
return
n*fun(n-1);
如果n>1,函數
返回值
為n*fun(n-1)
else
return
1;
}
否則為1;
main()
主函數
{int
i,s=0;
整型i,s,其中s=0
for(i=1;i<=4;i++)
i小於等於4時,運行s+=fun(i),然後i自加
s+=fun(i);
s等於s加上函數fun的返回值
printf(''%d\n",s);
}
列印s
最後結果為s=1+2*1+3*2*1+4*3*2*1

Ⅷ C語言函數的返回值(遞歸)

inthehe(intn){
if(n<=1)return1;
returnn*hehe(n-1);
}

我們一點一點來看:

首先 n = 0 傳入,if條件滿足 返回 hehe(0) = 1

在傳入 n = 1, if條件還是滿足 返回 hehe(1) = 1

我們傳入參數 n = 2, if 條件不滿足 hehe(2) = 2 * hehe( 2 - 1 )= 2 * 1

在我們傳入 n =3 , if條件不滿足 hehe(3) = 3 * hehe(2) ==> 3 * 2 * 1

你繼續這個步驟 ,對任何正整數n

hehe(n) = n * hehe(n-1) = n * (n-1) * ......* 1

明白了嗎?!