C語言中,所有的執行語句都只能出現在函數之中。同樣,函數的調用也只能出現在某函數的函數體內。函數的調用以兩種方式出現:函數的嵌套與函數的遞歸。 C語言中,所有函數的定義都是互相平行和獨立的,一個函數的定義不能包含另一個函數的定義,即不允許函數的嵌套定義。但函數的調用可以通過用一個函數另一個函數來實現,這就形成了函數的嵌套定義!C語言不限制嵌套的個數和層數,這樣我們就可以自由,合理的組織程序的模塊結構
程序調用自身的編程技巧稱爲遞歸( recursion)。
一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型複雜的問題層層轉化爲一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重複計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
注意:
(1) 遞歸就是在過程或函數裏調用自身;
(2)
在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口
1fibonacci數列問題
#include<stdio.h>
static long fibonacci(int n) //內部函數
{
if(n==1||n==2)
return 1;
else
{
return fibonacci(n-2)+fibonacci(n-1);
}
}
void main()
{
int n,i;
printf("Input n.");
scanf("%d",&n);
for(i=1;i<=n;++i)/*列出每一項的值*/
{
printf("%ld",fibonacci(i));
}
}
#include<stdio.h>
int age(int n)
{
int c;
if(n==1||n==2)
c=1;
else
c=age(n-1)+age(n-2);
return c;
}
void main()
{
printf("%d\n",age(5));
}
#include<stdio.h>
void main()
{
float fac(int);
int n;
float y;
printf("Input an integer number:\n");
scanf("%d",&n);
y=fac(n);
printf("%d!=%10.0f\n",n,y);
}
float fac(int n)
{
float f;
if(n<0)
{
printf("n<0 data error!");
}
else
if(n==0||n==1)
f=1;
else f=fac(n-1)*n;
return f;
}
//在調用一個函數的過程中又出現直接或間接的調用該函數本身
#include<stdio.h>
int age(int n)
{
int c;
if(n==1)
c=10;
else
c=age(n-1)+2;
return c;
}
void main()
{
printf("%d\n",age(5));
}