C語言的函式呼叫是遞迴嗎,C語言的函式呼叫是遞迴嗎?

時間 2022-04-01 21:21:07

1樓:

沒記錯的話,c語言中的函式直接或間接呼叫自己的過程叫遞迴例如 有main函式,函式a,c。

直接呼叫型遞迴:main函式呼叫函式a,而a不能直接解決問題,所以改變引數後去再次呼叫函式a。

比如有三個人,人1說他比人2小1歲,人2說他比人3小一歲,人3說他10歲,求人1幾歲。就需要遞迴解決,

簡介呼叫就是main呼叫a,a呼叫c,c又需要呼叫a,作用迴圈解決問題後由a回到main。

2樓:遺失的迷惘

「遞迴」外在表現出來的形式,是:函式自己呼叫自己。也就是說:如果我們定義了乙個函式fun(),那麼,在fun函式體中,fun這個函式自己呼叫自身 ,這就是表示:遞迴呼叫。

我們來看一下,下面這個程式段:

上述c語言程式中,第7行到第10行,就是使用「迴圈」的方式,來實現從0一直累加到100的和。大部分情況下,「迴圈」與「遞迴」之間,都可以相互轉換。

​在使用遞迴的時候,需要注意以下兩點:

需要有乙個「遞迴出口」,如果沒有乙個出口,那麼遞迴就會一直執行下去,一直到將「棧空間」佔滿為止。那時程式就會崩潰,所以一定是要有乙個「遞迴出口」。

如果所要執行的次數比較多,可以盡量選擇用「迴圈」的方式,因為使用「遞迴」的方式,程式執行的速度會比較慢。

3樓:

遞迴只是乙個演算法,c函式是物件導向的方法

4樓:gta小雞

函式在內部呼叫自己的過程稱為遞迴。

5樓:

程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式語言中廣泛應用。 乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。

6樓:開開小哥

什麼函式嘍,不說清楚沒法講啊

c語言中的函式可以巢狀呼叫也可以遞迴呼叫,這句話對嗎?

7樓:遠巨集

這句話是不對的。

巢狀是兩種結構間的關係,而不是函式間的關係。遞迴是乙個函式呼叫自身,可以看作是乙個函式呼叫另乙個函式中的較特別的例子。

函式巢狀與遞迴呼叫的區別函式巢狀是語言特性,遞迴呼叫是邏輯思想。

8樓:

巢狀怎麼呼叫?巢狀是兩種結構間的關係,而不是函式間的關係,所以這句話是不對的。

遞迴是乙個函式呼叫自身,可以看作是乙個函式呼叫另乙個函式中的較特別的例子,是對的。

c語言的函式巢狀呼叫與函式遞迴呼叫有啥區別?

9樓:安義翟衣

巢狀呼叫這個名詞是沒有任何意義的,看到那本書上有這個名詞趕緊扔掉吧!

遞迴是函式(或過程其他語言)直接或間接呼叫自已的做法!例如1)直接遞迴呼叫

intf(int

n)2)問接呼叫

double

g(double

x,int

n);doube

f(double

x,int

n)double

g(double

x,n)

10樓:隨wds緣

我個人認為 單從物件來說 巢狀是呼叫乙個「東西」,遞迴只是把自己呼叫了,自己成了那個東西。從性質來講巢狀是函式的特性及本能就是「調」而遞迴卻不是這樣的,遞迴太狹窄了。

11樓:

遞迴呼叫 就是函式裡出現自己呼叫自己,直接或曲折迂**用到自己。

巢狀呼叫就是不同子程式之間相互呼叫,無論如何曲折迂迴,也不出現自己呼叫自己的情況。

12樓:司煙雀念

需要明白的是

函式巢狀是語言特性,遞迴呼叫是邏輯思想。

函式巢狀允許在乙個函式中呼叫另外乙個函式,比如有三個函式funca()

funcb()

funcc()

這個就叫做巢狀呼叫,它是乙個語言提供的程式設計的方法,也就是語言的特性。

而遞迴是一種解決方案,一種思想,將乙個大工作分為逐漸減小的小工作,比如說乙個和尚要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然後考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了……,遞迴是一種思想,只不過在程式中,就是依靠函式巢狀這個特性來實現了。

遞迴最明顯的特點就是,自己呼叫自己(不就巢狀呼叫了嘛)。

funca()

概括說,函式巢狀就是函式呼叫函式,是普遍的,遞迴就是函式呼叫自身,使函式巢狀的乙個特例。

我說的不知道明不明白,有點亂……

13樓:利德

巢狀就是在乙個函式裡呼叫其它的函式(可以是自己)

遞迴就是函式裡又呼叫自己這個函式的特殊情況,所以遞迴還是巢狀,只不過因為這種遞迴用法很特殊,解決某些問題顯得很簡鍊,所以單獨介紹

14樓:游素枝鈔裳

函式巢狀是語言特性,遞迴呼叫是邏輯思想。

1函式巢狀

函式巢狀允許在乙個函式中呼叫另外乙個函式,比如有三個函式

例:funca()

funcb()

funcc()

這個就叫做巢狀呼叫,它是乙個語言提供的程式設計的方法,也就是語言的特性。

2遞迴呼叫

而遞迴是一種解決方案,一種思想,將乙個大工作分為逐漸減小的小工作,比如說乙個和尚要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然後考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了……,遞迴是一種思想,只不過在程式中,就是依靠函式巢狀這個特性來實現了。

遞迴最明顯的特點就是,自己呼叫自己。

例:funca()

概括說,函式巢狀就是函式呼叫函式,是普遍的,遞迴就是函式呼叫自身,使函式巢狀的乙個特例。

巢狀呼叫就是某個函式呼叫另外乙個函式,遞迴呼叫是乙個函式直接或間接的呼叫自己。舉幾個例子:a呼叫b(巢狀)b呼叫c(巢狀)a呼叫a(遞迴)a呼叫b

b呼叫a

(遞迴)a呼叫b

b呼叫c

c呼叫a

(遞迴)

15樓:匿名使用者

函式呼叫: 為了實現某種功能,在"某程式段"裡面呼叫了已實現此功能的函式a,這叫函式呼叫.

巢狀呼叫: a呼叫b,b呼叫c,這一系列的呼叫叫巢狀呼叫.可以理解為像這樣的兩次"函式呼叫"就叫巢狀呼叫.

第歸呼叫: a呼叫自己本身a,這種函式呼叫叫遞迴呼叫.而像a這樣的函式叫遞迴函式.

理解就好,不要專牛角尖.花多點時間在其他未知的地方.

c語言 函式遞迴呼叫是怎麼回事?

16樓:匿名使用者

一般來說是自己呼叫自己,一般有兩個分支,乙個分支是呼叫自己,還有乙個分支是結束條件

如求n!

int f(int n)

還有乙個比較複雜一點,是雙向呼叫,也就是a函式呼叫b函式,b函式在呼叫a函式

這樣迴圈呼叫,其實基於這個道理,還有多個函式互相呼叫,不過這樣的情況很少見

但萬變不離其宗,每個函式都有兩個分支,乙個是結束條件,乙個是呼叫函式

17樓:匿名使用者

遞迴呼叫是一種特殊的巢狀呼叫,是某個函式呼叫自己,而不是另外乙個函式。但是呼叫的時候肯定有乙個終止條件,退出遞迴呼叫。

18樓:匿名使用者

函式自己呼叫自己,或兩函式互相巢狀。

19樓:匿名使用者

自己呼叫自己就是遞迴,資料結構中的樹遍歷可以用遞迴實現。

c語言函式的遞迴呼叫?

20樓:紫月開花

是的,區域性變數會新定義一次,不過僅侷限於區域性變數(全域性變數和靜態變數都是全域性的,要是還沒學暫時不用管)。

並不能說是「同時」,應該說是「同樣」,時間上肯定是按照呼叫的先後順序的。

遞迴確實會讓程式變慢,但只是相對於不需要遞迴的等價**。而且原因也不是記憶體分配導致的,而是因為函式呼叫產生的。

21樓:凌芫勞葉農

這個遞迴呼叫怎麼沒有

返回型別

而且也沒有結束的條件啊

你看下遞迴呼叫的例子就能發現你寫的遞迴不能實現

22樓:雪芃長流如

遞迴有乙個堆疊的概念,那就意味著他是乙個反理解的過程:就象數學遞推一樣,你知道第一項,第二項,又知道通項公式,那你就可以知道任何一項。

然後你看**:fun(0)==0,fun(1)==1;是告訴你一二項。

fun(n)==fun(n-1)+fun(n-2);是告訴你通項公式。那麼,你就可以知道任何一項。你這樣理解就差不多了,具體機器是怎麼操作的,那很複雜的,也不需要明白!!!!

23樓:篤嘉原巨集博

第四句應該是

if(n==0||n==1)

吧!還有printt裡fac(a)後面括號裡多了乙個分號!

24樓:之朋桂興生

你沒輸入實參,應該這樣呼叫:

void

main()

25樓:閭卿吉谷雪

遞迴就是自己呼叫自己,最笨的辦法就是按編碼流程一步一步算,看明白就會了

26樓:年朗羊舌慧月

遞迴:就是函式自己呼叫自己,然後在函式體內設乙個終止遞迴的條件。

比如:void

func(int

num)

void

main(void)

27樓:零雪屠珺琪

你這個不是遞迴呼叫吧。兩個函式的名字都不一樣,這個方法的原理是x*y=gbs(x,y)*gys(x,y)。就是兩個數的乘積等於它們的最大公約數和最小公倍數的乘積。

c語言,遞迴函式是如何呼叫

28樓:匿名使用者

沒有遞迴,你把自己想的太高階了

先執行fun(d)也就是fun(1)

d=5,d=d+p=5+1=6

列印了6

然後執行fun(a+fun(d))=fun(3+6)=fun(9)d=6,d=d+p=6+9=15

列印了15

最後列印fun(a+fun(d))

等於15

29樓:匿名使用者

首先fun(d) d=1時 printf("%d",d) 輸出是 6 fun(a+6) 接著 printf("%d",d)輸出為 14 最後

printf(" %d\n",fun(a+fun(d)) 輸出 14

c語言中函式遞迴呼叫中的壓入堆疊是什麼意思啊

30樓:

我通俗點說:棧這個東西,你可以想象成手槍的彈夾,你裝入子彈後,最後裝入的子彈一定是最先打出去的,對吧?這就是棧的先進後出原則。

遞迴函式,你想想,一定是最後執行的函式最先執行完,然後執行倒數第二個...以此類推。壓入棧的意思就是現在記憶體給你乙個彈夾,函式就是你的子彈,你把沒執行一次這個函式,就是向彈夾裡裝了乙個子彈,這就是壓棧。

出棧就是當找到遞迴函式出口後,再倒著乙個乙個解決剛才一大堆的函式,就像手槍吧子彈乙個乙個在打出去。關於棧,建議你學學彙編,一下就明白了

31樓:匿名使用者

遞迴分兩部,先是把複雜的函式分解成簡單函式;再有簡單函式的值來計算複雜的函式。前面乙個過程就是壓棧過程

c語言函式遞迴呼叫問題。

32樓:天涯海角

c語言函式呼叫整個過程是當準備呼叫函式時,先將形參以從右往左進行壓棧程式跳轉到函式入口,將函式的區域性變數壓棧(如果函式內部再呼叫函式就是在重複這個過程),函式返回時出棧,遞迴是在最後乙個點上面函式返回,前面分配的資源根本沒有釋放,遞迴只有在最後乙個返回點上面,根據遞迴順序反過來釋放資源,這也是為什麼當遞迴的資料量比較大或者遞迴的層次比較深的時候,很容易造成記憶體溢位的原因

33樓:豐又青

首先系統執行c語言程式是有個棧和堆的

遞迴過程主要用到了棧

棧的原理是先進先出,相當於摞盤子,我只能拿走最上面的那個系統執行函式時會把函式壓入棧裡

遞迴的過程就是利用這點,把函式壓入棧中,但是這個函式的結果需要執行另乙個函式,再繼續壓入棧中,知道出現遞迴出口,就是最後乙個函式有了結果

開始**,乙個乙個出棧,跟樓主的結論2差不多

c語言函式的遞迴呼叫,C語言的函式巢狀呼叫與函式遞迴呼叫有什麼區別

是的,區域性變數會新定義一次,不過僅侷限於區域性變數 全域性變數和靜態變數都是全域性的,要是還沒學暫時不用管 並不能說是 同時 應該說是 同樣 時間上肯定是按照呼叫的先後順序的。遞迴確實會讓程式變慢,但只是相對於不需要遞迴的等價 而且原因也不是記憶體分配導致的,而是因為函式呼叫產生的。這個遞迴呼叫怎...

c語言中自定義函式中遞迴呼叫是怎樣工作的

先說工作原理 首先要清楚,遞迴就是某個函式直接或間接地呼叫了自身,這種呼叫方式叫做遞迴呼叫。說白了,還是函式呼叫。既然是函式呼叫,那麼就有乙個雷打不動的原則 所有被呼叫的函式都將建立乙個副本,各自為呼叫者服務,而不受其他函式的影響。你的ff函式,遞迴多少次,就有多少個副本,再利用記憶體的棧式管理,反...

c語言中函式能呼叫函式嗎,C語言中函式能呼叫函式嗎

來自天鵝洞尊敬的薔薇 你說的是函式巢狀吧?可以的 只是你這個函式a 應該後面沒有分號的! 這很明顯是可以的,你想想,主函式也是乙個函式對不對,可是裡面又呼叫有printf scanf 函式,所以,學習語言是要很靈活的,畢竟你不可能只靠一種語言。補充下 呼叫可以巢狀,但是定義不可以。 可以呼叫的 但是...

c語言的函式能不能呼叫全域性變數,C語言的函式能不能呼叫全域性變數?

當然可以呼叫全域性變數,這個程式報錯的原因是 x不是全域性變數 全域性變數就是在函式外面定義的變數,修改如下 include int x 注意這裡 void func int main void func int a x明顯是區域性變數,作用域只在main函式中x定義在函式外部時,才是全域性變數 比...

用函式編漢諾塔問題的程式,C語言函式遞迴呼叫漢諾塔問題

include include include hanoil 子程式,實現將n個盤子從a移動到c void hanoil int n,char a,char b,char c 主程式 int main puts the steps of moving plates are hanoil n,a,b,...