1樓:豔陽高照的午後
遞迴函式:
程式語言中,函式func(type a,……)直接或間接呼叫函式本身,則該函式稱為遞迴函式。遞迴函式不能定義為行內函數。
在數學上,關於遞迴函式的定義如下:對於某一函式f(x),其定義域是集合a,那麼若對於a集合中的某一個值x0,其函式值f(x0)由f(f(x0))決定,那麼就稱f(x)為遞迴函式。
函式介紹:
在數理邏輯和電腦科學中,遞迴函式或μ-遞迴函式是一類從自然數到自然數的函式,它是在某種直覺意義上是"可計算的" 。事實上,在可計算性理論中證明了遞迴函式精確的是圖靈機的可計算函式。遞迴函式有關於原始遞迴函式,並且它們的歸納定義(見下)建造在原始遞迴函式之上。
但是,不是所有遞迴函式都是原始遞迴函式 — 最著名的這種函式是阿克曼函式。
其他等價的函式類是λ-遞迴函式和馬爾可夫演算法可計算的函式。
例子://**1
void func()
條件:一個含直接或間接呼叫本函式語句的函式被稱之為遞迴函式,在上面的例子中能夠看出,它必須滿足以下兩個條件:
1) 在每一次呼叫自己時,必須是(在某種意義上)更接近於解;
2) 必須有一個終止處理或計算的準則。
梵塔的遞迴函式:
//cvoid hanoi(int n,char x,char y,char z)}
2樓:宮月柯微瀾
遞迴求階乘
的吧,不過你寫的有問題,函式既然接受
形參n,在函式裡就不用再讀取了;而且函式返回的是long型別,應該強制轉換
返回值。
3樓:匿名使用者
這樣吧,你不要管什麼遞迴,你自己想一下,不用遞迴,怎麼解這個問題,最後得出的思路肯定就恰好是遞迴的過程
4樓:
這是道漢諾塔的題目
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
意思是說
1)如果我把上面的 n-1個元素放到第二個柱子上2)那麼我就可以把最下面的棋子放到第三個柱子上3)然後我再把第二個柱子上的n-1個棋放到第三個柱子上第二個引數是源地址,第四個引數是目標地址,第三個引數是暫存地址。
5樓:匿名使用者
分成三組:
(一),
目的:將1號和2號從a移到b
呼叫函式:hanoi(2,'a', 'c', 'b')。
在hanoi(2,'a', 'c', 'b')中遞迴呼叫如下:
a-->c----hanoi(1,'a', 'b', 'c')a-->b----hanoi(1,'a', 'c', 'b')c-->b----hanoi(1,'c', 'a', 'b')(二),
目的:將3號從a移到c
呼叫函式:hanoi(1,'a', 'b', 'c')a-->c
(三),
目的:將1號和2號從b移到c
呼叫函式:hanoi(2,'b', 'a', 'c')在hanoi(2,'b', 'a', 'c')中遞迴遞迴如下:
b-->a----hanoi(1,'b', 'c', 'a')b-->c----hanoi(1,'b', 'a', 'c')a-->c----hanoi(1,'a', 'b', 'c')=====================總共呼叫了7次函式,
只要hanoi()的第一個引數大於1,它就會在內部呼叫自身3次,「直到第一個引數=1,然後呼叫printf()」。
hanoi(n, ...)呼叫hanoi(1, ...)的次數為2的n次方減去一。
6樓:夢想窗外
我做了個圖,如果需要將你的email地址發過來。
請用c語言編寫遞迴函式
7樓:
//迴圈實現
#include
int main()
printf("%d", t);
return 0;
}簡單修改一下就可以變遞迴了。**如下
#include
int fanzhuan(int n,int t)int main()
c語言遞迴函式的問題?
8樓:匿名使用者
#include
void f(int a) }
void main()
遞迴就好比 設計了一大堆同樣的函式,每個函式名和定義的自用變數名都不同,互不衝突
主函式: f(a), a=23471
_f(a): a=23471, 因為a不等於0成立,執行f(a/10);並等待執行完畢後繼續執行printf
__f1(a): a=2347,因為a不等於0成立,執行f(a/10);並等待執行完畢後繼續執行printf
___f2(a): a=234,因為a不等於0成立,執行f(a/10);並等待執行完畢後繼續執行printf
____f3(a): a=23,因為a不等於0成立,執行f(a/10);並等待執行完畢後繼續執行printf
_____f4(a): a=2,因為a不等於0成立,執行f(a/10);並等待執行完畢後繼續執行printf
______f5(a): a=0,因為a不等於0不成立,直接返回上一層呼叫者
_____f4(a): a=2,繼續執行printf輸出[2 ],返回上一層呼叫者
____f3(a): a=23,繼續執行printf累計輸出[2 3 ],返回上一層呼叫者
___f2(a): a=234,繼續執行printf累計輸出[2 3 4 ],返回上一層呼叫者
__f1(a): a=2347,繼續執行printf累計輸出[2 3 4 7 ],返回上一層呼叫者
_f(a): a=23471,繼續執行printf累計輸出[2 3 4 7 1 ],返回上一層呼叫者
main(): printf輸出換行,結束
9樓:匿名使用者
給定f(n),sum=0。計算n/10,結果為0結束遞迴,sum=sum+n。否則計算n%10,sum=sum+n%10。然後遞迴呼叫f(n/10)。
10樓:聽不清啊
這個函式只要判斷,如果是一位數的話,就直接返回這個引數,否則就返回末位數及其前面幾位的和。
下面是這個函式的**:
int f(int n)
c語言中的遞迴函式有什麼用途?什麼意義? 10
11樓:匿名使用者
好像麻煩 沒什麼作用啊!階乘我有for迴圈照樣實現又簡單!
int f(int n)//實現階乘引數
return tem;}
12樓:匿名使用者
在做 函式時候你會用到的 !
在 遞迴呼叫時候用到 啊
象計算 階乘的時候 就可以了 !
13樓:匿名使用者
遞迴函式提供了不一樣的思維方式,用他來解決往往程式要短小很多,思維也會很清晰。它很適合解決樹中的一些問題,在編譯原理中也可以經常看到。
它的主要的解決問題的思維是這樣的:
先解決最基礎的簡單的問題;
然後把複雜的問題歸結為較簡單的問題或把較大的問題分解為較小的問題。
下面這小段程式是用遞迴寫的用來求1到n所有這些正整數的和的:
int f(int n)
第一句解決了最簡單的問題,就是n==1的情況。接下去在求較複雜的f(n)的時候把它歸結為較簡單的問題f(n-1)。
用遞迴也有幾個需要注意的問題:
1.程式總得要有機會讓它退出來,不然會變成死迴圈。就象這裡的第一句,而且一般來說位置也通常在第一句。
2.遞迴還有效能開銷。一是因為函式呼叫時引數的入棧出棧操作。
二是有些問題處理不當會出現重複計算(不是很老到的程式設計師經常會出這樣的問題,導致效能有問題,然後說遞迴根本沒實際意義)。
c語言怎麼用遞迴呼叫函式的方法求n的階乘?
14樓:飛喵某
1、開啟vc6.0軟體bai,新建
一個duc語言的專案:
2、接zhi下來編寫主程dao序,首先定義內用來求階乘的遞容歸函式以及主函式。在main函式裡定義變數sum求和,呼叫遞迴函式fact(),並將返回值賦予sum,最後使用printf列印sum的結果,主程式就編寫完了:
3、最後執行程式,觀察輸出的結果。以上就是c語言使用遞迴求階乘的寫法:
給我解釋一下c語言遞迴函式?
15樓:匿名使用者
遞迴演算法:是一種直接或者間接地呼叫自身的演算法。在計算機編寫程式中,遞迴演算法對解決一大類問題是十分有效的,它往往使演算法的描述簡潔而且易於理解。
遞迴演算法的特點
遞迴過程一般通過函式或子過程來實現。
遞迴演算法:在函式或子過程的內部,直接或者間接地呼叫自己的演算法。
遞迴演算法的實質:是把問題轉化為規模縮小了的同類問題的子問題。然後遞迴呼叫函式(或過程)來表示問題的解。
遞迴演算法解決問題的特點:
(1) 遞迴就是在過程或函式裡呼叫自身。
(2) 在使用遞迴策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。
(3) 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。
(4) 在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等。所以一般不提倡用遞迴演算法設計程式。
遞迴演算法所體現的「重複」一般有三個要求:
一是每次呼叫在規模上都有所縮小(通常是減半);
二是相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入);
三是在問題的規模極小時必須用直接給出解答而不再進行遞迴呼叫,因而每次遞迴呼叫都是有條件的(以規模未達到直接解答的大小為條件),無條件遞迴呼叫將會成為死迴圈而不能正常結束。 例子如下:
描述:把一個整數按n(2<=n<=20)進位制表示出來,並儲存在給定字串中。比如121用二進位制表示得到結果為:「1111001」。
引數說明:s: 儲存轉換後得到的結果。
n: 待轉換的整數。
b: n進位制(2<=n<=20)
void
numbconv(char *s, int n, int b)
/* figure out first n-1 digits */
numbconv(s, n/b, b);
/* add last digit */
len = strlen(s);
s[len] = "0123456789abcdefghijklmnopqrstuvwxyz"[n%b];
s[len+1] = '\0';
}void
main(void)
exit(0);}
16樓:匿名使用者
額,抽象的說就是解決一個問題時重複使用一個動作,那麼就可以用遞迴的方式來解決,告訴電腦重複做這個動作就行.結合看一些遞迴演算法的簡單程式,應該好懂些.
17樓:申冰潔隱祺
分析一下fac()是如何執行的。假設讀入的n=3。
首先,main()函式中的y=fac(3),引起第1次函式呼叫。進入函式後實參n=3,應執行計算3*fac(2)
為了計算fac(2),引起對fac()函式的第2次呼叫(遞迴呼叫),重新進入函式fac(),實參n=2,應執行計算2*fac(1)。
為了計算fac(1),引起對函式fac()的第3次呼叫(遞迴呼叫),重新進入函式,實參n=1,應執行計算1*fac(0)。
為了計算叫fac(0),引起對函式fac()的第4次呼叫(遞迴呼叫),重新進入函式,實參n=0,此時執行f=1和return(f),完成第4次呼叫,回送結果fac(0)=1,返回到第3次呼叫層。
計算執行f=1*fac(0)和return(f),完成第3次呼叫,回送結果fac(1)=1
返回到第2次呼叫層。
計算執行f=2*fac(1)和return(f)。完成第2次呼叫,回送結果fac(2)=2,返回到第1次呼叫層。
計算執行f=3*fac(2)和return(f).完成第1次呼叫,回送結果fac(3)=6,返回到土函式。
用C 語言編寫程式,遞迴函式,用c 編寫程式用遞迴法計算一個整數的所有數字之和
1 在數學上,關於遞迴函式的定義如下 對於某一函式f x 其定義域是集合a,那麼若對於a集合中的某一個值x0,其函式值f x0 由f f x0 決定,那麼就稱f x 為遞迴函式。在程式語言中,把直接或間接地呼叫自身的函式稱為遞迴函式。函式的構建通常需要一個函式或者一個過程來完成。2 遞迴函式 是建立...
c語言遞迴求階乘,c語言怎麼用遞迴呼叫函式的方法求n的階乘?
問明 舉例 用遞迴方法求n include int main int n int y printf input a integer number scanf d n y fac n printf d d n n,y return 0 int fac int n int f if n 0 printf...
C語言程式設計,函式,使用C語言程式設計編寫一個函式?
include int main printf d n sum return 0 c語言程式設計函式 三城補橋 c語言中一個完整的函式由函式首部和函式體構成,而且定義函式時兩者都是必不可少的。函式定義的一般形式如下 型別識別符號 函式名 形參表列 這是函式首部 以下內的是函式體 舉例說明如下 定義一...