C语言练习二——函数和递归法

C语言练习笔记
第一次记录了一些控制语句相关的小例程,忘了做归纳,本次开始先附上控制语句的分类。

C语言练习二——函数和递归法_第1张图片
最近写了几个函数和递归法相关的例子,如下。
1.确定圆周率Π的值用蒙特卡洛法
要求:输入N为投掷次数(2<=N<=5000)

#include
#include
#include
main()
{
     
	do{
     
		int RM,p,ci;
		int i,yuan;
		float pi,x,y,r;
		RM=RAND_MAX;
		yuan=0;                 //未赋初值会导致结果错误 
		do{
     
			printf("请输入投掷次数N:");
			scanf("%d",&ci);
		}while((ci<2)||(ci>50000));
		for(i=1;i<=ci;i++)
		{
     
			p=rand();
			x=((float)p)/RM;        
			p=rand();
			y=((float)p)/RM;
			r=sqrt((x*x)+(y*y));
			if(r<=1)
			yuan=yuan+1;
		}
		pi=4*((float)yuan)/ci;
		printf("%f\n",pi);
	}while(1);
 }

2.用删除法删除掉1~N中的非质数,输出一个质数数组。
方法提示:可删除2的倍数(除了2),3的倍数,5的倍数……下一个未删除数的倍速,直到根号N。

#include
 #include
 #define SIZE 1000
 int a[SIZE];
 void sieve()
 {
     
 	int i,j,sq;
 	for(i=0;i<SIZE;i++)
 		{
     
 			a[i]=0;
		 }
		  sq=sqrt(SIZE);
		 for(i=4;i<=SIZE;i+=2)
		 {
     
		 	a[i]=1;
		 }
		
		 for(i=3;i<=sq;i+=2)        //j小于等于sq 仅需删除到根号N 
		 {
     
		 	if(a[i]==0)
		 	{
     
		 		for(j=i*2;j<=SIZE;j+=i)     
		 			a[j]=1;
			}
		}
		a[1]=1;
 }
 main()
 {
     
 	int i,N;
	sieve();                       //删除函数 
 	printf("生成数组为1~%d:",N);
 	scanf("%d",&N);	
	for(i=1;i<N;i++)
		{
     
		 	if(a[i]==0)
	 		printf("%3d",i);        //输出剩下的数 
	 	}
  } 

3.输入一个数N,用递归法对1~N求和。
PS:递归法是C语言中最常用的方法之一,核心是在子函数中不断调用自己,须掌握此方法。

#include
   int summation(int sum)         //累加子函数   形参为sum 
  {
     
  	if(sum==1)	sum=1; 
	else		sum=sum+summation(sum-1);	 //调用自己即递归 
	return sum;
  }
  main()                              
  {
     
  	int N,R;
  	printf("请输入要计算的数:");
	scanf("%d",&N);
	R=summation(N);           //实参为N传入子函数,计算累加和 
	printf("%d",R);
	return(0);
   } 

4.输入一个数N,用递归法求N的阶乘。

#include
   int fib(int F)
   {
     
   	int a;
   	if(F<=1)	a = 1;
   	else		a = F*fib(F-1);
   	return a;
   }
   main()
   {
     
   	int N,B,i;
   	while(1)
   	{
     
	   	printf("N的阶乘:\n");
		scanf("%d",&N);
		B=fib(N);                     //实参不写类型 
		printf("%d",B); 	 //循环 打印数列 
		printf("\n");
	   }
   	return (0); 
   }

5.用递归法求斐波那契数列
斐波那契数列是第N项为前两项的和,第0项和第1项可自己任意给出,本程序中给前两项分别赋值0和1。

 #include
   /*int fib(int F)
   {
   	if(F==1)	return 0;               
   	if(F==2)	return 1;
   	if(F>2)		return (fib(F-2)+fib(F-1));
   }
   main()
   {
   	int N,B,i;
   	while(1)
   	{
	   	printf("列数前N项斐波那契数:\n");
		scanf("%d",&N);
		B=fib(N);                     //实参不写类型 
		for(i=1;i<=N;i++)
		{
			printf("%3d",fib(i)); 	 //循环 打印数列 
		}
		printf("\n");
	   }
   	return (0); 
   }

可能还没有做一些指针相关的题目,感觉也不是那么难,以前有一点被程序唬到了,继续加油,不秃头!

你可能感兴趣的:(C语言练习,c语言,程序设计,编程语言,visual,studio,code)