遞迴的煩惱!! 35,遞迴的煩惱!!

2025-01-28 02:35:18 字數 5714 閱讀 9163

遞迴的煩惱!!

1樓:披頭浪子

你想的大概是對的。程式的大概邏輯是這樣的:

首先,你main()函式呼叫age(5),系統回去記憶體中查詢「int age(int)」這個函式,然後把「5」作為引數傳給age函式並呼叫他;

這時age()函式就開始執行了,按照你的邏輯,首先要判斷穿進來的引數n是否等於1,顯然5!=1,所以程式走else路徑,也就是c=age(n-1)+2;

這是程式發現又要呼叫int age(int)函式,於是系統有分配一塊記憶體區域用於再次呼叫age(),這是傳進去的引數就變為4了,於是程式會像上面呼叫的那樣執行,不停地呼叫age()函式,也就是age(5)呼叫age(4),age(4)呼叫age(3),直到n為1時;

當n==1時(也就是age(2)呼叫age(1)),程式就走if路線了,也就是「c=10」,然後把c返回給呼叫他的函式,這裡就是age(2);

age(2)得到age(1)返回來的值,他就能把原來停在那裡的else路徑走通,也就是。

c=age(n-1)+2」,即c=age(1)+2,這樣age(2)就計算出c的值了,然後返回給。

age(3),一直這樣返回,一直返回到age(5);

main函式得到age(5)的值後,在傳遞給printf函式,列印出來。

程式大概就是這麼執行的,其實,你可以跟蹤除錯一下就會明白了。

嗯。其實你也可以把程式該成這樣子:

int age(int n)

int c;

if(n==1)c=10;

else c=age(n-1)+2;

printf("*我馬上要把c(即%d)返回給age(%d)嘍。n",c,n-1);/

return(c);

另外,這個函式也可改成非遞迴的:

int age(int n)

int c=10;

while(n-->1)

c+=2;return c;

水平有限,就說這麼多了,紕漏之處見諒啊,希望你能明白我的意思啊~呵呵。

2樓:網友

為什麼會遞推!?

先來了解下遞迴程式的執**況,遞迴呼叫其實和函式呼叫其他函式是一樣的。

函式的呼叫,有呼叫和返回。有呼叫就一定要有返回。(當然不返回也是可以的,就如結束程式之類的一樣)

遞迴顧名思義,就是有乙個向前與回返的過程。

int age(int n)

int c;

if(n==1)c=10;

else c=age(n-1)+2;//在一次呼叫中。這個表示式的意思是求出c的值。當這個表示式已經求出後,我們知道,程式一定會執行後面的語句。

return(c);

遞迴程式又怎樣呢,我們可以把呼叫函式本身的語句看成是呼叫其他函式的語句。這樣便於理解。

這如以上題目,由於條件不滿足,我們呼叫a函式(也就是函式本身,你也可以看成是本身函式的乙個副本),a函式由於條件不滿足,繼續呼叫b函式,b函式條件不滿足,繼續呼叫c函式,然後c函式滿足條件,返回b函式。b函式再返回a函式,a函式再返**用函式的本身。

就如以下。int a(int n)

int c;

if(n==1)c=10;

else c=b(n-1)+2;

return(c);

int b(int n)

int c;

if(n==1)c=10;

else c=c(n-1)+2;

return(c);

int c(int n)

int c;

if(n==1)c=10;

else c=d(n-1)+2;

return(c);

int d(int n)

int c;

if(n==1)c=10;

else c=e(n-1)+2;

return(c);

int e(int n)

int c;

if(n==1)c=10;

else c=f(n-1)+2;

return(c);

int f(int n)

int c;

if(n==1)c=10;

else c=g(n-1)+2;

return(c);

int g(int n)

int c;

if(n==1)c=10;

else c=age(n-1)+2;

return(c);

當然你可以繼續寫下去。其實這就是遞迴函式執行時的呼叫過程。你可以看成函式呼叫自身時是呼叫了乙個函式的副本或別的函式。

什麼是遞迴?遞迴有什麼用?

3樓:假裝1椒

乙個過程或函式在其定義或說明中又直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。遞迴的能力在於用有限的語句來定義物件的無限集合。用遞迴思想寫出的程式往往十分簡潔易懂。

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

1) 遞迴就是在過程或函式里呼叫自身; (2) 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口。 遞迴演算法一般用於解決三類問題: (1)資料的定義是按遞迴定義的。

fibonacci函式) (2)問題解法按遞迴演算法實現。(回溯) (3)資料的結構形式是按遞迴定義的。(樹的遍歷,圖的搜尋) 遞迴的缺點:

遞迴演算法解題的執行效率較低。在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等。

遞迴通俗的講就是乙個函式在其**中反覆呼叫自身。你應該知道菲波納契數列,這個數列的定義是f(x)=1?(x=1)f(x)=2?

x=2)f(x)=f(x-1)+f(x-2) (x>2)也就是說從第三項開始的每一項的值都等於是前兩項之和。這在數學中叫遞推數列--高中數學內容。

4樓:師琦巧鹹易

遞迴就是自己呼叫自己,使用遞迴的時候,必須要有乙個出口,例如當x=1時f(x)=1.遞迴可以簡化操作,但是,會大大降低效率。遞迴可以降解為非遞迴。

5樓:網友

一句話,用整體思維看待問題,你會用整體法來分析力,遞迴就不成問題,當然意義絕不僅如此。

還是遞迴的問題

6樓:網友

values是個陣列,值的範圍是0-9.

printarray(5);會被解釋成。

printarray(4);

" + 5-1) +"] " + values[5-1]);

printarray(4);會被解釋成。

printarray(3);

" + 4-1) +"] " + values[4-1]);

printarray(3);會被解釋成。

printarray(2);

" + 3-1) +"] " + values[3-1]);

類推 printarray(5)

最終的形式是。

printarray(0); //這個沒有輸出,直接return跳出,既終止當前方法;

" + 1-1) +"] " + values[1-1]);

" + 2-1) +"] " + values[2-1]);

" + 3-1) +"] " + values[3-1]);

" + 4-1) +"] " + values[4-1]);

" + 5-1) +"] " + values[5-1]);

7樓:網友

void printarray(int i)執行"[" + i-1) +"] " + values[i-1]);之前,先執行了。

if(i==0) return;

else printarray(i-1);

執行printarray(9),在列印[9] 9之前,先呼叫了printarray(8);

執行printarray(8),在列印[8]8之前,又呼叫了printarray(7);

.以此類推。

列印[i]i之前一定先列印了[i-1]i-1的呀要先列印[9]9的話,只需要交換一下你的語句的位置就行了,如下:

void printarray(int i)

尾遞迴!

8樓:網友

過程式的語言通常不強調尾遞迴,何況姿哪慎由於c++的特殊性(緩咐含有解構函式、異常等),有些情況下必須保留遞迴而不能優化成迴圈。所以作為跡敬c++編譯器,預設完全不執行尾遞迴優化也是正常的。

9樓:網友

遞迴的時候敬緩,記憶體會分配乙個棧給函式。

當遞散擾歸的次數超過一定數量,就是那個棧滿了,就會記憶體錯誤,俗稱re,導致宕機衝稿旦。

10樓:忻忻相惜

c允許乙個函式呼叫其本身,這種呼叫過程被稱作遞迴(recursion)。

最簡單的遞迴形式是把遞迴呼叫語句放在函式結尾即恰在return語句之前。這種形式被稱作尾遞迴或者結尾遞迴,因為遞迴呼叫出現在函式尾部。由於為遞迴的作用相當於一條迴圈語句,所以隱啟纖它是最簡單的遞迴形式。

遞迴中必須包含可以終止遞迴呼叫的語句!

遞迴的有點在於為某些程式設計問題提供了最簡單的方法,而缺點是一些遞迴灶仿算旁遲法會很快耗盡計算機的記憶體資源。同時,使用遞迴的程式難於閱讀和維護。

遞迴問題

11樓:阿生哥

rec(5)

5 * rec(5 - 1)

5 * rec(4)

5 * 4 * rec(4-1))

5 * 4 * rec(3))

5 * 4 * 3 * rec(3-1)))5 * 4 * 3 * rec(2)))

5 * 4 * 3 * 2 * rec(2-1)))5 * 4 * 3 * 2 * rec(1)))滿意攜培請採睜緩納。辯早唯。

12樓:目送

遞睜譁歸轎早正 返回錯了。

double qiupi(int n){

double x;

if(n ==1)

return 1;

else return (qiupi( n - 1 ))1 /閉悔 ( n * n ))

遞迴的使用

13樓:網友

其實這個最主要是經驗問題,說明你碰到的類似問題不夠多。

遞迴亂喚最主要就是利用了一種叫棧的資料結構,你可以找一些簡單的使用棧來解題的題目,用遞迴來解。

使肆冊用遞迴最主要就是要理解,用離散的思維想問題,要針對每乙個節點,而裂陪巨集不是整個問題。

如何理解遞迴

14樓:網友

遞迴就是以自己呼叫自己來重複進行某一操作,把某些複雜問題,化作簡單問題。

例如求1x1+2x2+3x3+..nxn,這個問題可以變成成nxn+(n-1)x(n-1)+(n-2)x(n-2)..

n-(n-1))x(n-(n-1))然後分解成nxn+(n-1)x(n-1)的值再加(n-2)x(n-2),之後再加(n-3)x(n-3)

一直加到到(n-(n-1))x(n-(n-1)).

int num=0;

public int number(int n)else}

遞迴查詢的向上遞迴和向下遞迴是什麼意思

備忘錄方法是動態規劃方法的變形。與動態規劃演算法不同的是,備忘錄方法的遞迴方式是自頂向下的,而動態規劃演算法則是自底向上的。如 求lcs的問題 當xi yj時,求c i,j 只需知道c i 1,j 1 而無需用到c i,0 c i,j 1 及c i 1,j c i 1,n 當只需求出一個lcs時,可...

再問遞迴的問題,再問一個遞迴的問題

函式呼叫時,只有被呼叫函式返回,才會繼續執行,就是fn b 1 b賦值c不會立即執行,會壓棧儲存,壓棧時會儲存任何一個變數 符號等等,棧是從高地址往低地址走的,比如先壓入c,再壓入 接著fn b 1 這裡就會進入函式fn,接著從函式開始壓入內容,也就是直到有一個fn返回才會壓入後面的 和b,分析遞迴...

c語言函式遞迴的理解,C語言函式遞迴的理解

對於遞迴,我大致引用一位計算機競賽教練的話 皇帝傳近臣 幫我算一下1 2 3等於多少 然後近臣傳太監 幫我算一下2 3等於多少 太監回近臣 2 3 5 然後近臣回皇帝 1 2 3 1 5 6 這裡每個人為一次函式呼叫。即是說 從頭探到尾,在尾處找到答案後,再回傳給頭。c語言遞迴呼叫的理解 所謂遞迴,...