函式的巢狀呼叫與遞迴(初學者)
1、函式的巢狀呼叫
巢狀定義是在定義一個函式時,其函式體內又包含另一個函式的完整定義。
然而,C語言不能巢狀定義函式,但可以巢狀呼叫函式,也就是說,在呼叫一個函式的過程中,又呼叫另一個函式。
例:
main()
{
a();
}
a()
{
b();
}
b()
{
return;
}
例題:計算s=2²!+3²!
思路:(1)可編寫兩個函式,一個是用來計算平方值的函式square,另一個是用來計算階乘值的函式factorial。
(2)主函式先調square計算出平方值,再在square中以平方值為實參,呼叫factorial函式計算其階乘值,再返回主函式,在迴圈程式中計算累加和。
#include <stdafx.h> #include<stdio.h> long square(int p); long factorial(int q); void main() { int i; long s=0; for(i=2;i<=3;i++) { s=s+square(i); } printf("%ld\n",s); } long square(int p) { int k; long r; k=p*p; r=factorial(k); return (r); } long factorial(int q) { long c=1; int i; for(i=1;i<=q;i++) { c*=i; } return c; }
2、遞迴
在呼叫一個函式的過程中又出現直接或間接地呼叫該函式本身,稱為函式的遞迴呼叫。C語言的特點之一就在於允許函式的遞迴呼叫。
例:int flint (x)
{
int y,z;
z=flint(y);
return (2*z);
}
注:遞迴函式必須要有一個退出條件!
例:用遞迴的方法求n!
思路:求n!也可用遞迴的方法,即5!=4!*5,4!=3!*4……可用如下遞迴公式表示:
n=1(n=0,1)
n*(n-1)!(n>1)
#include <stdafx.h> #include<stdio.h> long recusion(int n); void main() { int n; long result; printf("input a integer number:\n"); scanf("%d",&n); result=recusion(n); printf("%d!=%ld\n",n,result); } long recusion(int n) { long tomp_result; if(n<0) { printf("n<0,input error!\n"); } else if(n==0||n==1) { tomp_result=1; } else { tomp_result=n*recusion(n-1); } return tomp_result; }
注:遞迴演算法是效率低下的演算法,但有些問題卻只能用遞迴演算法才能實現。如:Hanoi塔問題。