例题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: