函数对外界的影响仅仅是几个入口参数。
//求n! #include <stdio.h> long jiecheng( int n ) { int i = 1; long result = 1; if( n == 0||n == 1 ) { result = 1; } else { for( i = 1;i <= n ;i++ ) //循环n次 { result *= i; } } return result ; } int main() { int a = 0; long jieguo = 0; do { printf("input a num for n!\n"); scanf("%d",&a); }while( a < 0 ); //判断参数是否输入正确 jieguo = jiecheng( a ); //传参 printf("%d! = %ld\n",a,jieguo); return 0; } input a num for n! 12 12! = 479001600
刚刚的阶乘的函数需要进行对入口(参数)的合法性的维护,维护程序的健壮性。 判断n必须大于0
//求组合C k(上标) m(下标) = m!/{k!*(m-k)!} #include <stdio.h> long jiecheng( int n ) //阶乘函数 { int i = 1; long result = 1; for ( i = 1;i <= n; i++) { result *= i; } return result; } int main() { int m = 0; int k = 0; long zuhe ; printf(" input k m :\n "); scanf("%d,%d",&k,&m); if( m < k || m <= 0 || k <= 0 ) //判断值是否输入正确 { printf("input error!,please reinput!\n"); printf(" input k m :\n "); scanf("%d,%d",&k,&m); } if( m == k ) //组合特殊情况 { zuhe = 1; } else { zuhe = jiecheng( m )/(jiecheng( k )*jiecheng( m - k ));//公式 } printf("result = %ld\n",zuhe); return 0; } [root@localhost 413hanshu]# ./a.out input k m : 5,10 result = 252 [root@localhost 413hanshu]# ./a.out input k m : 3,6 result = 20 如果一个对象部分地由它自己组成或按它自己定义,则我们称之为递归。就是由自己推出自己 还是阶乘的问题: n!:1 n=0,1; n*(n-1)! n>=2; //求n! #include <stdio.h> long jiecheng( int n ) { int i = 1; long result = 1; if ( n == 0||n == 1 ) { result = 1; } else { result = (n*jiecheng(n - 1 )); //阶乘 } return result ; } int main() { int a = 0; long jieguo = 0; do { printf("input a num for n!\n"); scanf("%d",&a); }while( a < 0 ); //判断参数是否输入正确 jieguo = jiecheng( a ); //传参 printf("%d! = %ld\n",a,jieguo); return 0; } 递归调用函数必须包含两种部分: 1.由其自身定义的与原始问题类似的的更小的规模的子问题,它使递归过程持续进行,称为一般情况。 2.递归调用的最简形式,它是一个能够用来结束递归调用过程的条件,通常称为基线情况 变量的作用域和存储类型 不在任意的语句块定义的变量叫全局变量。全局变量的作用域为整个程序,即全局变量在程序的所有位置都有效。 结合递归和全局变量:打印出函数fib(n)的输出值和循环次数 fib(n): 0 n=0; 1 n=1; fib(n-1)+fib(n-2) n>1; #include <stdio.h> #include <stdlib.h> int count = 0; //计数递归调用了多少次 int fib( int n) { int result = 0; count ++; //计数递归调用次数 if( n < 0) //判断是否输入正确 { printf("input error!\n"); exit (0) ; } else if( n == 0 ) { result = 0; } else if( n == 1 ) { result = 1; } else { result = fib( n - 1) + fib ( n - 2 ); //递归 } return result; } int main() { int a = 0; int Result = 0; printf("intput n \n"); scanf("%d",&a); Result = fib (a); printf("result = %d\n",Result); printf("count = %d\n",count); return 0; }[root@localhost 413hanshu]# ./a.out intput n 5 result = 5 count = 15
变量的存储类型: 存储类型 数据类型 变量名表; c语言提供了了一下几种不同的存储类型: 1.自动变量 2.静态变量 3.外部变量 4.存储器变量 1自动变量:格式: auto 类型名 变量名 因为经常使用 auto可以省略。 在不同的并列语句内可以同名变量,不会互相干扰,因为它们各自占据着不同的内存单元,并且有着不同的作用域。 例如:形参就可以与实参同名。 可以用const将形参声明成常量,可以有效防止形参值在函数内被修改。 1.自动变量在定义 时不会自动初始化 2.自动变量在退出函数后,其分配的内存立即释放。 静态变量: static 类型名 变量名;生存周期是整个程序运行时间。整个程序执行期间,只能被初始化一次。 具有一定的记忆功能。 外部变量: extern 类型名 变量名 ; 外部变量保存在静态存储区内,在程序运行期间分配固定的存储单元,气生存期是整个程勋的运行期。自动初始化0. 寄存器变量:没有必要。