无论传递什么参数,函数都有副本机制
改变一个变量,需要传入变量的地址
改变一个指针变量,需要传入指针变量的地址
//int add(int a, int b);挖取函数声明
//int ()(int a, int b);换成括号
//int (*p)(int a, int b);加上*指针名
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int add(int a, int b) 7 { 8 return a + b; 9 } 10 11 main() 12 { 13 //int add(int a, int b);挖取函数声明 14 //int ()(int a, int b);换成括号 15 //int (*p)(int a, int b);加上*指针名 16 17 int(*p)(int a, int b) = add; 18 printf("%d", p(1, 2)); 19 20 system("pause"); 21 }
例11.2
通过给 trans 函数传送不同的函数名,求 tan x 和 cot x 值。
1 #include <stdio.h> 2 #include <math.h> 3 double tran(double(*) (double), double(*) (double), double); /* 函数说明语句 */ 4 main() 5 { 6 double y, v; 7 v = 60 * 3.1416 / 180.0; 8 y = tran(sin, cos, v); /* 第一次调用 */ 9 printf("tan(60)=%10.6f ", y); 10 y = tran(cos, sin, v); /* 第二次调用 */ 11 printf("cot(60)=%10.6f ", y); 12 } 13 double tran(double(*f1) (double), double(*f2) (double), double x) 14 { 15 return (*f1) (x) / (*f2)(x); 16 }
例11.3
用递归的方法求n!
求n!可用以下数学关系表示:
n!= 1 当n=0时
n!= n * ( n - 1 )! 当n>0时
1 #include <stdio.h> 2 int fac(int n) 3 { 4 int t; 5 if (n == 1 || n == 0) 6 { 7 return 1; 8 } 9 else 10 { 11 t = n*fac(n - 1); 12 return t; 13 } 14 } 15 main() 16 { 17 int m, y; 18 printf("Enter m:"); 19 scanf("%d", &m); 20 if (m < 0) 21 { 22 printf("Input data error ! "); 23 } 24 else 25 { 26 y = fac(m); 27 printf(" %d!=%d ", m, y); 28 } 29 }
例11.4
用递归算法根据以下求平方根的迭代公式求某数 a 的平方根:
x1 = (x0 + a / x0) / 2
1 #include <stdio.h> 2 #include <math.h> 3 double mysqrt(double a, double x0) 4 { 5 double x1; 6 x1 = (x0 + a / x0) / 2.0; 7 if (fabs(x1 - x0) > 0.00001) 8 { 9 return mysqrt(a, x1); 10 } 11 else 12 { 13 return x1; 14 } 15 } 16 main() 17 { 18 double a; 19 printf("Enter a:"); 20 scanf("%lf", &a); 21 printf("The sqrt of %f=%f ", a, mysqrt(a, 1.0)); 22 }
11.12
请编写递归函数,把输入的一个整数转换成二进制数输出。
1 #include <stdio.h> 2 void outninary(int a) 3 { 4 int d; 5 d = a % 2; 6 if (a != 0) 7 { 8 outninary(a / 2); 9 printf("%d", d); 10 } 11 } 12 main() 13 { 14 int a; 15 scanf("%d", &a); 16 outninary(a); 17 }
11.13
请用递归算法,求 1+2+3+...+n,n 由键盘输入。
1 #include <stdio.h> 2 int sum(int n) 3 { 4 if (n != 0) 5 { 6 return n + sum(n - 1); 7 } 8 else 9 { 10 return 0; 11 } 12 } 13 main() 14 { 15 int n, y; 16 scanf("%d", &n); 17 y = sum(n); 18 printf("y=%d", y); 19 }
11.14
请用递归算法,求数列 Fibonacci。求 n 阶 Fibonacci 数列的公式如下:
1 当 n=0 时
F(n)= 1 当 n=1 时
F(n-1)+F(n-2) 当 n>1 时
1 #include <stdio.h> 2 int f(int n) 3 { 4 if (n == 0 || n == 1) 5 { 6 return 1; 7 } 8 else 9 { 10 return (f(n - 1) + f(n - 2)); 11 } 12 } 13 main() 14 { 15 int n, y; 16 scanf("%d", &n); 17 y = f(n); 18 printf("y=%d", y); 19 }