當前位置:首頁 » 編程語言 » c語言中的雙重遞歸調
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中的雙重遞歸調

發布時間: 2022-06-24 20:00:01

㈠ 講一下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語言中遞歸調用的實例以及講解。

下面演示一個斐波那契數列前N項和#include <stdio.h>
#define COL 10 //一行輸出10個
long scan()
{ //輸入求fibonacci函數的第N項
int n;
printf("Input the N = ");
scanf("%d",&n);
return n;
}
long fibonacci(int n)
{ //fibonacci函數的遞歸函數
if (0==n||1==n) { //fibonacci函數遞歸的出口
return 1;
}
else {
return fibonacci(n-1)+fibonacci(n-2);
//反復遞歸自身函數直到碰到出口處再返回就能計算出第n項的值
}
}
int main(void)
{
int i,n;
n = scan();
printf("Fibonacci數列的前%d項\n", n);
for (i=0; i<n;) //輸出fibonacci函數前n項每項的值
{
printf("%-10ld",fibonacci(i++)); //調用遞歸函數並且列印出返回值
if(i%COL==0)
{ //若對COL取余等於0就換行,也就是控制每行輸出多少個,
//而COL=10就是每行輸出10個
printf("\n");
}
}
printf("\n");
return 0;
}

㈢ C語言里函數遞歸調用該怎樣理解

那你這樣想吧。數學中不是有遞推公式嗎。比如:A1=1, An=An-1 +2。那麼你用遞歸就是要想求An,只要An-1求出來,只要加2就是An啦。以此類推,只要知道A1就行啦。
int labi(int n)
{
if(n==1) return(1);
else return(labi(n-1)+2);
}

main()
{
int n,t;
scanf("%d",&n);
t=labi(n);
printf("%d\n",t);
}

㈣ C語言中遞歸調用是什麼怎麼回事。。

寫一個函數,在這個函數里呢調用自己本身這個函數,直到符合某個條件為止,然後一層一層返回出來,這樣的函數調用就叫遞歸調用
比如說,第一數是2,第二個數是第一個的4倍,第三個是第二個的4倍,依次到第十個數,請問第十個數是多少,就可以用遞歸了

㈤ C語言中的遞歸是什麼意思

程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種演算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。

遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。

一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。



(5)c語言中的雙重遞歸調擴展閱讀:

遞歸的應用

1、數據的定義是按遞歸定義的。(Fibonacci函數)

2、問題解法按遞歸演算法實現。這類問題雖則本身沒有明顯的遞歸結構,但用遞歸求解比迭代求解更簡單,如Hanoi問題。

3、數據的結構形式是按遞歸定義的。

遞歸的缺點

遞歸演算法解題相對常用的演算法如普通循環等,運行效率較低。因此,應該盡量避免使用遞歸,除非沒有更好的演算法或者某種特定情況,遞歸更為適合的時候。在遞歸調用的過程當中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。


㈥ c語言中的遞歸

本人學c++,c的語法已經淡忘了,但是遞歸不管什麼語言都是一個原理
其實簡單一點來說就像數學裡面的數列的通項公式:
例如一個數列是2,4,6,8,10......
很容易就可以得到通項公式是a[n]=2*n n是大於0的整數
你肯定學過這個數列的另外一種表示方式就是: a[1]=2, a[n]=a[n-1]+2 n是大於1的整數
其實這就是一個遞歸的形式,只要你知道初始項的值,未知項和前幾項之間的關系就可以知道整個數列。
程序例子:比如你要得到第x項的值
普通循環:
for(int i=1; i<=n; i++)
if (i == x)
cout << 2*i; /*cout 相當於 c裡面的printf,就是輸出.*/
遞歸:
int a(int x) {
if (x = 1)
return 2; /* 第一項那肯定是2了,這個也是遞歸的終止條件! */
else return a(x-1)+2; /* 函數自身調用自身是遞歸的一個特色 */
比如x=4,那麼用數學表示就是a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2
其實遞歸方法最接近自然,也是最好思考的一個方法,難點就是把對象建模成遞歸形式,但是好多問題本身就是以遞歸形式出現的。
普通遞歸就是數據結構上的堆棧,先進後出。
例如上面x=4,把a(4)放入棧底,然後放入a(3),然後a(2),a(1),a(1)的值已知,出棧,a(1)=2,a(2)出棧a(2)=a(1)+2=2+2=4,a(3)出棧a(3)=a(2)+2=(a(1)+2)+2=6,a(4)出棧a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2=8
再比如樓上的階乘例子,當n=0 或 1時,0!=1,1!=1,這個是階乘的初始值,也是遞歸的終止條件。然後我們知道n!=n*(n-1)!,當n>1時,這樣我們又有了遞歸形式,又可以以遞歸演算法設計程序了。(樓上已給出譚老的程序,我就不寫了)。
我給出一種優化的遞歸演算法---尾遞歸。
從我給出的第一演算法可以看出,先進棧再出棧,遞歸的效率是很低的。速度上完全比不上迭代(循環)。但是尾遞歸引入了一個新的函數參數,用這個新的函數參數來記錄中間值.
普通遞歸階乘fac(x),就1個x而已,尾遞歸用2個參數fac(x,y),y存放階乘值。
所以譚老的程序就變成
// zysable's tail recursive algorithm of factorial.
int fac(int x, int y) {
if (x == 1)
return y;
else return fac(x-1, y*x);}
int ff(int x) {
if (x == 0)
return 1;
else return fac(x,1);}
對於這個程序我們先看函數ff,函數ff其實是對fac的一個封裝函數,純粹是為了輸入方便設計的,通過調用ff(x)來調用fac(x,1),這里常數1就是當x=1的時候階乘值了,我通過走一遍當x=3時的值即為3!來說明一下。
首先ff(3),x!=0,執行fac(3,1).第一次調用fac,x=3,y=1,x!=1,調用fac(x-1,y*x),新的x=2,y=3*1=3,這里可以看到,y已經累計了一次階乘值了,然後x還是!=1,繼續第三次調用fac(x-1,y*x),新的x=1,y=2*3=6,然後x=1了,返回y的值是6,也就是3!.你會發現這個遞歸更類似於迭代了。事實上我們用了y記錄了普通遞歸時候,出棧的乘積,所以減少了出棧後的步驟,而且現在世界上很多程序員都在倡議用尾遞歸取消循環,因為有些在很多解釋器上尾遞歸比迭代稍微效率一點.
基本所有普通遞歸的問題都可以用尾遞歸來解決。
一個問題以遞歸來解決重要的是你能抽象出問題的遞歸公式,只要遞歸公式有了,你就可以放心大膽的在程序中使用,另外一個重點就是遞歸的終止條件;
其實這個終止條件也是包含在遞歸公式裡面的,就是初始值的定義。英文叫define initial value. 用普通遞歸的時候不要刻意讓自己去人工追蹤程序,查看運行過程,有些時候你會發現你越看越不明白,只要遞歸公式轉化成程序語言正確了,結果必然是正確的。學遞歸的初學者總是想用追蹤程序運行來讓自己來了解遞歸,結果越弄越糊塗。
如果想很清楚的了解遞歸,有種計算機語言叫scheme,完全遞歸的語言,因為沒有循環語句和賦值語句。但是國內人知道的很少,大部分知道是的lisp。
好了,就給你說到這里了,希望你能學好遞歸。

PS:遞歸不要濫用,否則程序極其無效率,要用也用尾遞歸。by 一名在美國的中國程序員zysable。

㈦ c語言的遞歸調用問題。

函數其實沒有釋放內存的概念,因為函數都是在指令區,而不是通常所說的釋放內存對應的數據區,不過在整個程序執行完之後指令區也是要釋放的。
函數調用的大概過程如下:
1,將調用函數的上下文入棧;
2,調用被調用函數;
3,被調換函數執行;
4,調用函數上下文出棧,繼續執行後繼指令。
所以在函數調用過程中原調用函數是不會退出的-----即你所說的釋放內存。
具體到你給的代碼:
首先main中調用test,
進入test後要求讀入一個char,
你輸入'1'後執行case
'1'中語句,所以輸出「已調用」,然後就執行test()語句,即遞歸調用,此時main調用的test要等新的test執行完畢才能繼續執行後繼的i++語句;
再次進入test之後與從main中進入時一樣,如果輸入的是'1'會接著遞歸調用test,由於你輸入了5次1,所以會繼續調用5次test;
在最後一個test中你輸入了ESC?
所以不再走case
'1'而走default了,所以輸出"222222";
switch執行完之後判斷c==27滿足,所以while循環退出,繼續執行printf語句,由於之前的test統統沒有執行過case
1里的i++語句,所以全局變數i還是0;輸出i=0;
到此最後一次test執行完畢;
倒數第二次的test繼續執行i++,
所以i=2了,case
1執行完畢,但由於沒有寫break語句,所以繼續執行default
語句,輸出"222222",
退出switch語句,判斷c==27,
由於c是全局變數,且最後一次輸入的剛好是ESC,
所以判斷滿足,
退出while循環,輸出i=1,
到此倒數第二次test執行完畢;
與倒數第二次類似的繼續執行倒數第三、倒數第四、倒數第五和最終的第一次test後繼代碼,也就輸出如你列出的結果了。

㈧ c語言函數遞歸調用

我給你舉個簡單的例子你就明白了,你可以假設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

滿意請採納

㈨ 請問這裡面的雙重遞歸怎麼去理解,或者這是屬於什麼方面的知識,我剛大一,C語言學了一學期,求大神。

哪裡面的?雙重遞歸就是在一個遞歸函數里兩次調用自身。

比如求解斐波那契數列的時候f(n)=f(n-1)+f(n-2).