C语言选择语句的例题与应用

例题2.5:

路径问题。如图2-8,计算从节点1到节点n(n大于1)共有多少条不同的路径。
在这里插入图片描述
【分析】

如图可以看出,当n大于1的奇数时,可经过前两个节点到达n;当n大于2的偶数时,可以经过前三个节点到达n。所以,求1到n的路径,必须计算前节点1到节点n-1,n-2,n-3的路径数。再用递归相加。

源码:

#include<stdio.h>

int Path(int n);

int main()
{
	int node;
	int result;
	printf("Please enter the node number\n");
	scanf("%d" ,&node);
	result = Path(node);
	printf("The Path number is %d\n" ,result);
	return 0;
} 

int Path(int n)
{
	if ( n < 1 )
	{
		return -1;	
	}
	else if ( n == 1 )
	{
		return 1;
	}
	else if ( n == 2 )
	{
		return 1;
	}
	else if (n % 2 == 1)		//如果是奇数
	{
		return Path(n -1) + Path(n - 2);
	} 
	else						//如果是偶数 
	{
		return Path(n - 1) + Path(n - 2) + Path(n- 3);
	}
}
 

测试1:
在这里插入图片描述
测试2:
在这里插入图片描述

相仿例题2.5:

编写递归函数,并在屏幕上显示如下杨辉三角
在这里插入图片描述

【设计理念】

该例题可以增强练习者对for循环的嵌套使用,以及对递归的深入理解。

【分析】
通过观察杨辉三角,可以发现第n行有n个元素,当n>2时,第m元素的值为其上一行的第 m-1个元素的值与第m个元素之和。每行的第一个和最后一个元素的值为1;同时,要保证每行前的空格。

源码:

#include<stdio.h>

int triangle(int x,int y);

int main()
{
	int iRow,i,k,j;
	printf("Please enter the row number:\n");
	scanf("%d", &iRow);
	for(i=0; i<iRow; i++)							//遍历行数 
	{
		for(k = (iRow-i) * 2; k>0; k--)				//遍历数列前的空格 
		{
			printf(" ");
		}
		for(j = 0; j <= i; j++)						//遍历每行的数列 
		{
			printf("%4d", triangle(i,j));
		}
		printf("\n");
	}
	return 0;
} 

int triangle(int x,int y)
{
	if(x == y || y == 0)							//每行数列首末为1 
	{
		return 1;
	}
	else
	{
		return triangle(x-1,y-1)+triangle(x-1,y);	//杨辉三角的规律 
	}

}
 

测试1:
在这里插入图片描述
测试2:

在这里插入图片描述

例题3.2:

利用近似公式pai/4=1-1/3+1/5-1/7+…计算圆周率,直到最后一项的绝对值小于10^-6。

【分析】
通过分析公式可以得出,分子都为1,分母都为1、3、5…2n-1的等差数列。但要保证相加绝对值小于10^-6.

源码:

#include<stdio.h>
#include<math.h>
double MyPi();
int main()
{
	printf("圆周率为:%f\n",MyPi());
	return 0;
}
double MyPi()
{
	int sign = 1, n;
	double item = 1.0, sum = 1.0;
	for(n = 1; fabs(item) > 1e-6; ++n)
	{
		sign = -sign;
		item = sign * 1.0/ (2 * n + 1);
		sum += item;
	}
	return 4 * sum;
 }
 

测试:
在这里插入图片描述

相仿例题3.2:

本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x0/0!− x2/2!+ x4/4! −x6/6!+⋯

【分析】
通过观察公式,发现分子为等比数列,分母为阶数。同时属于一正一负求和类型。

源码:

#include<stdio.h>
#include<math.h>

double funcos( double e, double x);

int main()
{
	double e, x;
	
	scanf("%lf %lf", &e,&x);
	printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
	
	return 0;
} 

double funcos( double e, double x)
{
	int i, flag=-1;
	double m=1.0, sum=1.0, item=1.0, n=1.0;		//定义初始值 
	
	for(i=2; item>e; i+=2)
	{
		m=m * x * x;			//分子等比数列 
		n=n * i * (i-1);		//分母阶数 
		item = m/n;
		sum += item * flag;
		flag = -flag;			//加变减,减变加 
	}
	return sum;
}

测试1:
在这里插入图片描述
测试2:
在这里插入图片描述
测试3:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值