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

2022-08-16 20:57:19 字數 4992 閱讀 3476

1樓:瀚漠

函式呼叫時,只有被呼叫函式返回,才會繼續執行,就是fn(b-1)+b賦值c不會立即執行,會壓棧儲存,壓棧時會儲存任何一個變數、符號等等,棧是從高地址往低地址走的,比如先壓入c,再壓入=

接著fn(b-1),這裡就會進入函式fn,接著從函式開始壓入內容,也就是直到有一個fn返回才會壓入後面的+和b,分析遞迴是從返回處分析的:

先返回的肯定是當b-1為1時,返回1,上一層就是:

c = jn(1) + 2;

這裡會返回c= 1+2 = 3; 再上一層就是:

c = jn(2) + 3;

這裡會返回c = 3 + 3 = 6; 再上一層:

c = jn(3) + 4;

這裡返回c = 6 + 4 = 10;

如此下去。。。。。。。。

就會發現這裡是計算1+2+3+4.....+99+100的和!

還有要理解為什麼每次加的數值會加1.。。

總之加的數字肯定比呼叫jn()時的引數大一:

c = jn(n-1) + n; 你能理解這個就知道為什麼每次加1了、、

壓棧的順序不用你考慮的,只要會分析就可以了。。。。。。。

壓棧是系統比較深層次的東西,考試也考不到,做應用程式也用不到。。。

2樓:淦海瑤

一般來說遞迴呼叫函式有兩個必備條件

一個是結束條件,如if那裡

一個是不符合結束條件時呼叫本身

要不然會成為死迴圈,撐滿記憶體宕機

c=fn(b-1)+b;執行到這裡,需要呼叫fn(b-1)時,再開闢一個記憶體空間來執行fn(b-1),一層一層的呼叫本身(都會新開闢記憶體空間)

直到b是1的時候,再一層一層的結束呼叫,返回運算結果一般來說,遞迴呼叫,會開闢很大的一塊記憶體空間,來用於呼叫函式

3樓:永兵

#include"stdio.h"

int fn(int b)

void main()

程式執行過程如下:

首先賦值100給b,計算fn(100),但只有b<=1時才知道c=fn(b)=1,所以要想計算fn(100)就必須先計算fn(99),且c=fn(99)+100;要想知道fn(99)就必須先知道fn(98),且c=fn(98)+99+100,以此類推,直到b=1,最後就是c=1+2+3+~+100,也就是5050.

至於「我想問下,就是那函式本身調自己,又用fn(b-1)的值 來改變自己,在此時,是改變了後立即用 fn(b-1)+b賦值c ,還是等符合前面的判斷後再從棧裡面一個個處理,那麼棧裡面又是按什麼順序存放的,又是如何處理的。。」不是立即用 fn(b-1)+b賦值c,而是最後計算c的值。

親,就這些了,看看能幫到您嗎?

4樓:匿名使用者

程式執行main首次呼叫fn,然後fn再一直呼叫自身,直到b=2時,fn(b-1)即fn(1)時返回1,在逐級返回c的值,最終返回到第一次呼叫,返回到主函式;

b=2: fn(1) return 1; c = fn(1) + 2; c = 3;

b=3: fn(2) return 3; c = fn(2) + 3; c = 6;

b=4: fn(3) return 6; c = fn(3) + 4; c = 10;

b=5: fn(4) return 10; c = fn(4) + 5; c = 15;

b=6: fn(5) return 15; c = fn(5) + 6; c = 21;

b=7: fn(6) return 21; c = fn(6) + 7; c = 28;

b=8: fn(7) return 28; c = fn(7) + 8; c = 36;

...b=95: fn(94) return 4465; c = fn(94) + 95; c = 4560;

b=96: fn(95) return 4560; c = fn(95) + 96; c = 4656;

b=97: fn(96) return 4656; c = fn(96) + 97; c = 4753;

b=98: fn(97) return 4753; c = fn(97) + 98; c = 4851;

b=99: fn(98) return 4851; c = fn(98) + 99; c = 4950;

b=100: fn(99) return 4950; c = fn(99) + 100; c = 5050;

最終fn(100) return 5050;

5樓:匿名使用者

呼叫自己和呼叫其它函式是差不多的,遞迴呼叫有點像電影《盜夢空間》的情節,進入一層fn(100)沒有找到答案,卻得到了fn(99),就再進入下一層,直到找到可以返回結果的這一層fn(1)(返回1),那麼就會返回給fn(2)=fn(1)+1,從而得出fn(2)的結果是2,繼續以此類推向上走,直到最頂層。

6樓:匿名使用者

涵數在呼叫自己,但是壓棧的時候是不同的物件.

7樓:匿名使用者

如果不算遞迴的話 結果應該是199

算上遞迴是5050

問個遞迴的問題,

8樓:匿名使用者

這裡的split(n,m),是最大加數不大於m的n的劃分數。

還是以6的劃分為例,當m=4時,觀察上面列出的結果,實際上就是最大加數等於4的情況,加上最大加數小於4的所有情況。最大加數小於4的以split(n, m-1)表示,而最大加數等於4的劃分數,實際上等於2的劃分數。

這個稍微有點繞,但其實很好理解。最大加數已經確定了,那麼無非就是n減去這個最大加數後的數有多少種劃分的問題了,所以這裡可能把它表示為split(n-m,m)。

這裡要注意的是第二個引數是m,而不是n-m,原因其實很簡單,看m=2的時候的結果就很清楚了,這時雖然最大加數是2,要看6-2=4的劃分數了,但因為最大加數已經是2,所以剩餘的4的劃分要限制最大加數不大於2。

9樓:湛藍微瀾

你說的是什麼呢?遞迴?

的#include「stdio.h中」

整數(整數n) ()

輸出x = 30,y = 21

結果,32並沒有出現。

回報計算機輔助藥物設計(i - 1)+計算機輔助藥物設計(i - 1);

這句話,計算機輔助藥物設計(一)不計算n +,但的2n +?

計算機輔助藥物設計(i - 1);

遞迴的過程是尋找底部,然後開始結果返回到上一層,不斷**的最終結果。層的計算,該函式返回的內部變數的結果都將被破壞,怎麼會有一個固定的常數的值嗎?

10樓:啊李超

基本整數劃分問題是將一個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於m。

即n=n1+n2+n3+……(其中,n1>=n2>=n3>=n4……)

對於這種問題,可以建立一下遞迴關係:

(1) q(n,1)=1,n>=1;

當最大加數m不大於1時,任何正整數n只有一種劃分,即n=1+1+1+1+1……

(2) q(n,m)=q(n,n),m>=n;

因為,顯然最大加數不能大於n……,囧

(3) q(n,n)=q(n,n-1)+1;

正整數n的劃分由n=n和m<=n-1的劃分組成

(即如果劃分中最大加數是n,則這種劃分為n=n,剩下的劃分最大加數為n-1)

(4) q(n,m)=q(n,m-1)+q(n-m,m);

同上,正整數n的劃分由m=m和m<=m-1的劃分組成(即如果劃分中最大加數是m,則這種劃分為n-m(將劃分中的一個必然存在的m減去)的最大加數為m的劃分,剩下的為最大加數為m-1的劃分)

什麼情況下可以利用遞迴來解決問題?再寫遞迴程式時應注意是什麼

11樓:匿名使用者

比如階乘,也就是說求n可以先求n-1,以此類推,到1,這類問題都可以用遞迴解決,菲波拉鍥數也可以遞迴。因為遞迴是總是呼叫自身解決問題,所以,必須有結束條件,否則會出問題,導致記憶體卡爆

問一個關於遞迴每層值的問題。

12樓:gta小雞

由於你傳的a是引用,所有遞迴函式中的a都是同一個物件,修改任何一個都會影響到其他函式中a的值。

問個關於遞迴的問題,

13樓:匿名使用者

我對pascal語言瞭解不太多,所以回答的可能有點問題,湊合著看吧,呵呵

第一題:

map[dep,y]:=true;是執行原來的y值,因為search()的引數為形參,是傳值的,所以函式結束後不會改變引數的值,

第二題:

二叉樹的pascal語言表示我沒看過,就淺淺的分析一下吧,當t=2時,執行t=t*2,就是就是尋找左孩子,執行tree(t),這時當然不會一直遞迴下去,因為tree()函式中有這樣一條語句if e[t]=0 then exit;當t達到上限時,就沒有節點了,這就保證了遞迴會及時的退出(當沒有孩子時)。找完左孩子,再找右孩子,t:=t+1;tree(t),原理同上,當沒有孩子時退出。

再說下我的感受,其實簡單遞迴是很好理解的,也很好寫,但是遞迴中有難題是非常繁瑣的,遞迴的思想還是很重要的,建議先從簡單的遞迴學起,抓住要害,再向高階遞迴前進

14樓:匿名使用者

分太少了不看!!

遞迴就是先進後出的壓棧操作,自己看去嘿嘿

一個遞迴簡單的問題

15樓:

#include

using namespace std;

int fun(int n)

void main()

16樓:杜茂彥

#include

using namespace std;

static int count=0;

int fun(int n)

void main()

再問關於家庭相處的問題,再問一個關於家庭相處的問題

這位朋友,你好!你的男生還是女生?你的姐姐讀書 學會忍讓,包容原諒姐姐就好,不要計較,大度一些,南無無盡意佛 問一個關於家庭相處的問題 親情間有些時候是要抄分清bai楚的,千萬不要和錢掛鉤,不然會保du不住的。像我zhi 和我姐,錢數低於20不會算賬,高於dao 這個數就不能貪這個便宜。而且正常是她...

編寫遞迴函式函式逆序輸出正整數,編寫一個遞迴函式函式逆序輸出一個正整數

實現指定 bai功能的遞迴函du數如下,呼叫時zhi只要使用daoreverse n 就可以得到自然專數n的逆序數輸出。屬void reverse int n void reverse int t 編寫遞迴函式將一個整數逆序輸出,求c程式 可以參考下面的 include void printdata...

C語言的兩個問題 所有的遞迴程式均可以用非遞迴演算法實現?遞

c語言所有遞迴都bai可以用非遞迴演算法實du現,最典型的就是 zhi迭代法dao,有時比遞迴更容專易理解。至 於遞迴中屬的形式引數是自動變數,沒明白樓主的意思,形參就是形參啊,形參變數也是變數,其記憶體分配在棧區,隨著函式的結束,其記憶體也會被釋放,形參的生命週期與函式生命週期相同哈 同生共死 i...