典型算法举例

一、递推法

  • 题目:

猴子吃桃问题:猴子第一天摘下若干个桃子,吃了一半,还觉得不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上时,只剩下一个桃子了。问第-天共摘了
多少桃子。

  • 分析:设前一天的桃子数用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;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值