一、递推法
- 题目:
猴子吃桃问题:猴子第一天摘下若干个桃子,吃了一半,还觉得不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上时,只剩下一个桃子了。问第-天共摘了
多少桃子。
-
分析:设前一天的桃子数用d1表示,后一天的桃子数用d2表示,则根据题意有d1=(d2+1) * 2。
现已知第十天只剩下一个桃子,可根据上面的式子计算出第九天的数量为(1+1)*2=4。即已知第十天,可计算第九天的数量;再根据第九天的数量计算出第八天的数量,…,最后倒推出第一天的数量。 -
代码:
#include <stdio.h>
int main()
{
int day, d1, d2;
day = 9;//第10天的桃子是已知的,还有9天
d2 = 1;
do
{
d1 = (d2 + 1) * 2;//计算前一天的桃子数
d2 = d1;//将前一天的桃子数作为后一天的桃子数
--day;
} while (day > 0);
printf("第一天摘了%d\n",d1);
return 0;
}
二、迭代法
- 题目:
用牛顿迭代法求方程2x3 - 4x2+3x-6=0在1.0附近的根
-
分析:牛顿迭代法又称为牛顿切线法,其原理如下图。
设方程f(x)=0有一个根x*。先任意设定与根x*接近的值x0作为方程的近似根,由x0求出f(x0),过(x0,f(x0))点作f(x)的切线与x轴交于x1,则此时切线的斜率为f’(x0)=f(x0)/(x0-x1),即有x1=x0-f(x0)/f’(x0)迭代公式;显然,x1比x0更接近x*。继续过点(x1,f(x1))作f(x)的切线与x轴交于x2,… 。当求得的xi与xi-1两点之间的距离小于给定的最大误差时,便认为xi就是方程f(x)=0的近似解了。
-
代码:
#include <stdio.h>
#include<math.h>
#define eps 1e-6
int main()
{
float x1, x0, f, f1;
x1 = 1.0;//设定初值
do
{
x0 = x1;//前一个近似根
f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
f1 = (6 * x0 - 8) * x0 + 3;
x1 = x0 - f / f1;//由迭代公式求得一个新的近似根
} while (fab(x1 - x0) > eps);//迭代满足的条件
printf("%6.2f\n",x1);
return 0;
}
三、穷举法
- 题目:
搬砖问题:36块砖,36人搬。男搬4、女搬3、两个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干
- 分析:设男的数目用men 表示,女的数目用women表示,小孩的数目用child表示,则根据题意可以确定:men的取值在0~ 9之间,women的取值在0~12之间,小孩的人数为36-men-women.
- 代码:
#include <stdio.h>
int main()
{
int men, women, child;
for(men=0;men<=9;men++)
for (women = 0; women <= 12; women++)
{
child = 36 - men - women;
if(men*4+women*3+child*0.5==36)
printf("男:%d,女:%d,小孩:%d\n",men ,women,child);
}
return 0;
}