【正文】
void main() { int max4(int a,int b,int c,int d)。 printf(“4 interger numbers:)。a,amp。c,amp。 max=max4(a,b,c,d)。 } 主函數(shù) 對 max4 函數(shù)聲明 include void main() { int max4(int a,int b,int c,int d)。 printf(“4 interger numbers:)。a,amp。c,amp。 max=max4(a,b,c,d)。 } 主函數(shù) 輸入 4個整數(shù) include void main() { int max4(int a,int b,int c,int d)。 printf(“4 interger numbers:)。a,amp。c,amp。 max=max4(a,b,c,d)。 } 主函數(shù) 調用后肯定是 4個數(shù)中最大者 輸出最大者 int max4(int a,int b,int c,int d) { int max2(int a,int b)。 m=max2(a,b)。 m=max2(m,d)。 } max4函數(shù) 對 max2 函數(shù)聲明 int max4(int a,int b,int c,int d) { int max2(int a,int b)。 m=max2(a,b)。 m=max2(m,d)。 } max4函數(shù) a,b中較大者 a,b,c中較大者 a,b,c,d中最大者 int max4(int a,int b,int c,int d) { int max2(int a,int b)。 m=max2(a,b)。 m=max2(m,d)。 } max4函數(shù) int max2(int a,int b) { if(a=b) return a。 } max2函數(shù) 找 a,b中較大者 int max4(int a,int b,int c,int d) { int max2(int a,int b)。 m=max2(a,b)。 m=max2(m,d)。 } max4函數(shù) int max2(int a,int b) { if(a=b) return a。 } max2函數(shù) return(ab?a:b)。 int m。 m=max2(m,c)。 return(m)。 } int max4(int a,int b,int c,int d) { int max2(int a,int b)。 m=max2(a,b)。 m=max2(m,d)。 } max4函數(shù) m=max2(max2(a,b),c)。 } int max4(int a,int b,int c,int d) { int max2(int a,int b)。 m=max2(a,b)。 m=max2(m,d)。 } max4函數(shù) m=max2(max2(max2(a,b),c),d)。 } int max4(int a,int b,int c,int d) { int max2(int a,int b)。 m=max2(a,b)。 m=max2(m,d)。 } max4函數(shù) ruturn max2(max2(max2(a,b),c),d)。 } int max4(int a,int b,int c,int d) { int max2(int a,int b)。 } int max2(int a,int b) { return(ab?a:b)。 …… } 例 用弦截法求方程 f(x)=x*x*x5*x*x+16*x80=0 的根 1. 取兩個不同點 x1,x2,如果 f(x1)和 f(x2)符號相反 ,則 (x1,x2)區(qū)間內必有一個根。注意 x x2的值不應差太大 ,以保證 (x1,x2)區(qū)間內只有一個根。公式為: x=(x1*f(x2)x2*f(x1))/(f(x2)f(x1)) f(x)。 反之 , 根必在( x1,x) 區(qū)間內 , 令 x2 = x. 2和 3步驟 , 直到 |f(x)|э 為止( э 為一個很小的數(shù)如 ) 。 NS流程圖 實現(xiàn)各部分功能的幾個函數(shù) : 函數(shù) f(x)=x*x*x5*x*x+16x80; 用函數(shù) xpoint(x1,x2)求弦截點的坐標; 用函數(shù) root(x1,x2)求區(qū)間 x1,x2上的根 。 } void main( )/ *主函數(shù) */ { float x1,x2,f1,f2,x; do{ printf( “input x1,x2:\n"); scanf( “%f,%f",&x1,&x2); f1=f(x1); f2=f(x2); } while( f1 *f2>=0); x=root(x1,x2); printf(" A root of equation is %\n", x ); } 運行情況如下: input x1,x2: 2,6 A root of equation is 函數(shù)的遞歸調用 ?在調用一個函數(shù)的過程中又出現(xiàn)直接或間接地調用該函數(shù)本身,稱為函數(shù)的 遞歸調用 。 f2函數(shù) 調用 f1函數(shù) 函數(shù)的遞歸調用 int f(int x) { int y,z。 return (2*z)。 printf(,age:%d\n,age(5))。 if(n==1) c=10。 return(c)。 ?解題思路: ?遞推法的特點是從一個已知的事實 (如 1!=1)出發(fā),按一定規(guī)律推出下一個事實 (如2!=1!*2),再從這個新的已知的事實出發(fā),再向下推出一個新的事實 (3!=3*2!)。 例 用遞歸方法求n!。 int n。 printf(input an integer number:)。n)。 printf(%d!=%d\n,n,y)。 if(n0) printf(n0,data error!)。 else f=fac(n1)*n。 } 注意溢出 例 Hanoi(漢諾)塔問題。有一個老和尚想把這 64個盤子從A座移到C座,但規(guī)定每次只允許移動一個盤,且在移動過程中在 3個座上都始終保持大盤在下,小盤在上。要求編程序輸出移動一盤子的步驟。一般人是不可能直接確定移動盤子的每一個具體步驟的 ?老和尚會這樣想:假如有另外一個和尚能有辦法將上面 63個盤子從一個座移到另一座。此時老和尚只需這樣做: ?解題思路: (1) 命令第 2個和尚將 63個盤子從 A座移到 B座 (2) 自己將 1個盤子(最底下的、最大的盤子)從 A座移到 C座 (3) 再命令第 2個和尚將 63個盤子從 B座移到 C座 A B C …… 將 63個從 A到 B 第 1個和尚的做法 …… A B C 將 63個從 A到 B 第 1個和尚的做法 …… A B C 將 1個從 A到 C 第 1個和尚的做法 …… A B C 將 1個從 A到 C 第 1個和尚的做法 …… A B C 將 63個從 B到 C 第 1個和尚的做法 …… A B C 將 63個從 B到 C 第 1個和尚的做法 A B C …… 將 62個從 A到 C 第 2個和尚的做法 A B C …… 將 62個從 A到 C 第 2個和尚的做法 A B C …… 將 1個從 A到 B 第 2個和尚的做法 A B C …… 將 1個從 A到 B 第 2個和尚的做法 A B C …… 將 62個從 C到 B 第 2個和尚的做法 A B C …… 將 62個從 C到 B 第 2個和尚的做法 第 3個和尚的做法 第 4個和尚的做法 第 5個和尚的做法 第 6個和尚的做法 第 7個和尚的做法 …… 第 63個和尚的做法 第 64個和尚僅做:將 1個從 A移到 C A B C 將 3個盤子從 A移到 C的全過程 將 2個盤子從 A移到 B A B C 將 3個盤子從 A移到 C的全過程 將 2個盤子從 A移到 B A B C 將 3個盤子從 A移到 C的全過程 將 1個盤子從 A移到 C A B C 將 3個盤子從 A移到 C的全過程 將 1個盤子從 A移到 C A B C 將 3個盤子從 A移到 C的全過程 將 2個盤子從 B移到 C A B C 將 3個盤子從 A移到 C的全過程 將 2個盤子從 B移到 C A B C 將 2個盤子從 A移到 B的過程 將 1個盤子從 A移到 C A B C 將 2個盤子從 A移到 B的過程 將 1個盤子從 A移到 C A B C 將 2個盤子從 A移到 B的過程 將 1個盤子從 A移到 B A B C 將 2個盤子從 A移到 B的過程 將 1個盤子從 A移到 B A B C 將 2個盤子從 A移到 B的過程 將 1個盤子從 C移到 B A B C 將 2個盤子從 A移到 B的過程 將 1個盤子從 C移到 B A B C 將 2個盤子從 B移到 C的過程 A B C 將 2個盤子從 B移到 C的過程 A B C 將 2個盤子從 B移到 C的過程 A B C 將 2個盤子從 B移到 C的過程 ? 由上面的分析可知:將 n個盤子從 A座移到 C座可以分解為以下 3個步驟: (1)將 A上 n1個盤借助 C座先移到 B座上 Hanoi( n1, A, C, B) (2) 把 A座上剩下的一個盤移到 C座上 move( A, C) (3) 將 n1個盤從 B座借助于A座移到 C座上 Hanoi( n1, B, A, C) include void main() { void hanoi(int n,char one, char two,char three)。 printf(“the number of diskes:)。m)。 hanoi(m,39。,39。,39。)。 if(n==1) move(one,three)。 move(one,three)。 } } void move(char x,char y) { printf(%c%c\n,x,y)。 例 輸入 10個數(shù),要求輸出其中值最大的元素 (和該數(shù)是第幾個數(shù) )。 int a[10],m,n,i。 for(i=0。i++) scanf(%d,amp。 printf(\n)。i10。 printf(“l(fā)argest number is %d\n,m)。 } for(i=1,m=a[0],n=0。i++) { if (max(m,a[i])m) { m=max(m,a[i])。 } } printf(“l(fā)argest number is %d\n,m)。 } int max(int x,int y) { return(xy?x:y)。 ?解題思路: ?用函數(shù) average求平均成績,用數(shù)組名作為函數(shù)實參,形參也用數(shù)組名 ?在 aver