A. 講一下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));
}
B. C語言關於函數的遞歸
你的遞歸程序是錯的,我轉來個對的,帶講解的,你看看。
語言函數的遞歸和調用
一、基本內容:
C語言中的函數可以遞歸調用,即:可以直接(簡單遞歸)或間接(間接遞歸)地自己調自己。
要點:
1、C語言函數可以遞歸調用。
2、可以通過直接或間接兩種方式調用。目前只討論直接遞歸調用。
二、遞歸條件
採用遞歸方法來解決問題,必須符合以下三個條件:
1、可以把要解決的問題轉化為一個新問題,而這個新的問題的解決方法仍與原來的解決方法相同,只是所處理的對象有規律地遞增或遞減。
說明:解決問題的方法相同,調用函數的參數每次不同(有規律的遞增或遞減),如果沒有規律也就不能適用遞歸調用。
2、可以應用這個轉化過程使問題得到解決。
說明:使用其他的辦法比較麻煩或很難解決,而使用遞歸的方法可以很好地解決問題。
3、必定要有一個明確的結束遞歸的條件。
說明:一定要能夠在適當的地方結束遞歸調用。不然可能導致系統崩潰。
三、遞歸實例
例:使用遞歸的方法求n!
當n>1時,求n!的問題可以轉化為n*(n-1)!的新問題。
比如n=5:
第一部分:5*4*3*2*1
n*(n-1)!
第二部分:4*3*2*1
(n-1)*(n-2)!
第三部分:3*2*1
(n-2)(n-3)!
第四部分:2*1
(n-3)(n-4)!
第五部分:1
(n-5)!
5-5=0,得到值1,結束遞歸。
源程序:
fac(int
n)
{int
t;
if(n==1)||(n==0)
return
1;
else
{
t=n*fac(n-1);
return
t;
}
}
main(
)
{int
m,y;
printf(「Enter
m:」);
scanf(「%d」,&m);
if(m<0)
printf(「Input
data
Error!\n」);
else
{y=fac(m);
printf(「\n%d!
=%d
\n」,m,y);
}
}
四、遞歸說明
1、當函數自己調用自己時,系統將自動把函數中當前的變數和形參暫時保留起來,在新一輪的調用過程中,系統為新調用的函數所用到的變數和形參開辟另外的存儲單元(內存空間)。每次調用函數所使用的變數在不同的內存空間。
2、遞歸調用的層次越多,同名變數的佔用的存儲單元也就越多。一定要記住,每次函數的調用,系統都會為該函數的變數開辟新的內存空間。
3、當本次調用的函數運行結束時,系統將釋放本次調用時所佔用的內存空間。程序的流程返回到上一層的調用點,同時取得當初進入該層時,函數中的變數和形參所佔用的內存空間的數據。
4、所有遞歸問題都可以用非遞歸的方法來解決,但對於一些比較復雜的遞歸問題用非遞歸的方法往往使程序變得十分復雜難以讀懂,而函數的遞歸調用在解決這類問題時能使程序簡潔明了有較好的可讀性;但由於遞歸調用過程中,系統要為每一層調用中的變數開辟內存空間、要記住每一層調用後的返回點、要增加許多額外的開銷,因此函數的遞歸調用通常會降低程序的運行效率。
五、程序流程
fac(int
n)
/*每次調用使用不同的參數*/
{
int
t;
/*每次調用都會為變數t開辟不同的內存空間*/
if(n==1)||(n==0)
/*當滿足這些條件返回1
*/
return
1;
else
{
t=n*fac(n-1);
/*每次程序運行到此處就會用n-1作為參數再調用一次本函數,此處是調用點*/
return
t;
/*只有在上一句調用的所有過程全部結束時才運行到此處。*/
}
}
C. c語言中,什麼是函數的遞歸,能舉個例子么
(PS:因為很多IT術語的定義都來源於國外,我們看的中文大部分是別人看了國外的文獻然後以他的中文素養加以解釋的!但是中華語言博大精深!而英語就較為簡單了,記得上次看高德納的《surreal number》時候,文中有一句「the beginning of the world」,而作者譯為「萬物初始」,從這里就可見一斑了!所以,對於一些不是很明白的IT術語,可以去看一下英文翻譯,可能會對你有幫助)遞歸的英文是recursion,有循環的意思。
能夠形成函數遞歸,該函數要有兩個屬性:
1.A simple base case (or cases), and
2.A set of rules which rece all other cases toward the base case.
For example, the following is a recursive definition of a person's ancestors:
One's parents are one's ancestors (base case).
The parents of one's ancestors are also one's ancestors (recursion step).
The Fibonacci sequence is a classic example of recursion:
Fib(0) is 0 [base case]
Fib(1) is 1 [base case]
For all integers n > 1: Fib(n) is (Fib(n-1) + Fib(n-2)) [recursive definition]
樓上的同志將遞歸的定義解釋得已經很清楚了,但是你想要真正了解什麼是函數遞歸,最好先了解什麼是遞歸!然後對於函數遞歸就豁然開朗了!
D. c語言遞歸函數
遞歸函數:
編程語言中,函數Func(Type a,……)直接或間接調用函數本身,則該函數稱為遞歸函數。遞歸函數不能定義為內聯函數。
在數學上,關於遞歸函數的定義如下:對於某一函數f(x),其定義域是集合A,那麼若對於A集合中的某一個值X0,其函數值f(x0)由f(f(x0))決定,那麼就稱f(x)為遞歸函數。
函數介紹:
在數理邏輯和計算機科學中,遞歸函數或μ-遞歸函數是一類從自然數到自然數的函數,它是在某種直覺意義上是"可計算的" 。事實上,在可計算性理論中證明了遞歸函數精確的是圖靈機的可計算函數。遞歸函數有關於原始遞歸函數,並且它們的歸納定義(見下)建造在原始遞歸函數之上。但是,不是所有遞歸函數都是原始遞歸函數 — 最著名的這種函數是阿克曼函數。
其他等價的函數類是λ-遞歸函數和馬爾可夫演算法可計算的函數。
例子:
//代碼1
void func()
{
//...
if(...)
func();
else
//...
}
條件:
一個含直接或間接調用本函數語句的函數被稱之為遞歸函數,在上面的例子中能夠看出,它必須滿足以下兩個條件:
1) 在每一次調用自己時,必須是(在某種意義上)更接近於解;
2) 必須有一個終止處理或計算的准則。
梵塔的遞歸函數:
//C
void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
E. C語言函數遞歸問題(含程序)
這是一個遞歸函數。
1.你如果輸入的是2,那麼在第一個age(2)里就會執行else語句,就是再調用age(2-1)==age(1),再age(1)里你知道是咋樣吧,
2.然後age(1)就會傳回10,你記得是age(2)里的else
c=age(n-1)+2調用的吧,返回的10就變成了c=10+2呸,如果你輸入5啊啥的就回多激磁遮掩的步驟.
3.這個遞歸歸函數的作用就是輸入n,得到10+2*(n-1).
F. c語言函數類似遞歸問題
從匯編的角度來說,函數返回值,其實就是函數返回後,cpu中eax的值。在C語言等語方中,在函數中寫了返回語句,那麼函數在返回時,就會對eax作最後賦值。
而你這裡面的if里沒有返回語句,只在else里有返回語句,所以b==0後函數返回到sumd(1),但是sumd(1)沒有返回語句,所以函數直接退出,上面的函數也是如此,所以直到返回到main中的整個回溯過程中,eax寄存器中的值始終是15,沒有改變,所以返回值就是15,但是一般編譯器會識別到這種寫法上的錯誤
我使用VS2008編譯時會報警告:warning
C4715:
「sumd」:
不是所有的控制項路徑都返回值
但是返回值依然是15
正確的寫法是:
void
main()
{
int
a;
a=sumd(12345);
printf("\n%d",a);
}
int
sumd(int
num)
{
static
int
sum;
int
a,b;
a=num%10;
b=(num-a)/10;
sum=sum+a;
if(b!=0)
return
sumd(b);//這里雖然是return,但是准備返回後又進入sumd,所以eax寄存器的值被重新修改,這也就是為什麼可以使用遞歸函數
else
return
(sum);
}
G. C語言,函數遞歸的調用
#include"stdio.h"
voidfun1(intn,intm){
if(m>0)
fun1(n,m-1);
printf("%-2d+%2d=%-2d",n,m,n+m);
}
voidfun2(intn,intm){
if(n>0)
fun2(n-1,m);
fun1(n,m-n);
printf(" ");
}
intmain(intargv,char*argc[]){
intN;
printf("InputN(int0<=N<=99)... N=");
if(scanf("%d",&N)!=1||N<0||N>99){
printf("Inputerror,exit... ");
return0;
}
fun2(N,N);
return0;
}
運行樣例:
H. 用C語言的函數遞歸方法來求
#include <stdio.h>
#include <math.h>
void fun2(int m)
{
int k=0,a[10];
for(int i=2;i<m;i++)
if(m%i==0)
a[k++]=i;
for(int i=0;i<k;i++)
{
printf("%d",a[i]);
if(i!=k-1)
printf(",");
}
}
void fun1(int m)
{
if(m<2)
printf("%d is a prime number",m);
for(int i=2;i*i<=m;i++)
if(m%i==0)
fun2(m);
else
printf("%d is a prime number",m);
}
int main( )
{ int n;
scanf("%d",&n);
fun1(n);
return 0;
}
I. C語言遞歸函數
#include<stdio.h>
voidfunc(intm,intn)
{
if(m)
{
if(n)
{
func(m,n-1);
printf("%d",m);
}
else
{
func(m-1,m-1);
if(m>1)
{
printf(" ");
}
}
}
}
intmain(void)
{
func(5,5);
return0;
}
J. C語言函數遞歸的理解
對於遞歸,我大致引用一位計算機競賽教練的話:
皇帝傳近臣:幫我算一下1+2+3等於多少
然後近臣傳太監:幫我算一下2+3等於多少
太監回近臣:2+3=5
然後近臣回皇帝:1+2+3=1+5=6
這里每個人為一次函數調用。即是說:從頭探到尾,在尾處找到答案後,再回傳給頭。