算法详解(一):迭代算法

一:递推法

兔子繁殖

  1. 问题:
    一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问1年中每个月各有多少对兔子。
  2. 分析
    一对兔子从出生后第三个月开始每月生一对小兔子,第三个月以后每月除了有上一个月的兔子外,还有新下小兔子。则第三个月以后兔子的对数就是前两个月兔子对数的和。繁殖过程如下。
    1月 2月 3月 4月 5月 6月 …
    1 1 1+1=2 2+1=3 3+2=5 5+3=8 …
    数学建模:
    y1=y2=1,yn=yn-1+yn-2,n=3,4,5…到此发现这个数列就是著名的斐波那契数列。
  3. 完整代码
#include "stdafx.h"


int main()
{
	int i, a = 1, b = 1,c;
	printf("1月兔子对数:%d\n", a);
	printf("2月兔子对数:%d\n", b);
	for (i = 1; i <= 10; i++)
	{
		c = a + b;
		printf("%d月兔子对数:%d\n",i+2, c);
		a = b;
		b = c;
	}//求3-4月的兔子对数
    return 0;
}

算法结果显示

二: 倒推法

猴子吃桃问题

  1. 问题:
    一只猴子摘了若干桃子,每天吃现有桃子的一半多一个,到第十天就只有一个桃子了,问猴子最初共摘了多少桃子?
    数学模型:
    每天的桃子数为:a10=1,a9=(1+a10)*2,a8=(1+a9)*2,…
    递推公式为:ai=(1+ai+1)*2 i=9,8,7,6,…,1
  2. 算法设计
    由于每天的桃子数只依赖前一天的桃子数,所以用一个迭代变量代表桃子个数就可以了。
  3. 完整代码
#include <stdio.h>
int main(void)
{
	int i;
	int sum = 1;//第10天剩1个桃子
	for (i = 1; i <= 10; i++)
	{    
		printf("the %02d day eat %5d peaches!\n", 11 - i, sum);
		sum = (sum + 1) * 2;

         
	}//求第1天的桃子数
	return 0;
}

求方程组的解

  1. 构建方程组
10x1-x2+2x3=6
-x1+11x2-x3+3x4=25
2x1-x2+10x3-x4=-11
3x2-x3+8x4=15

  1. 分析
    迭代法解方程的实质是按照下列步骤构造一个序列x0,x1,…,xn,来逐步逼近方程f(x)=0的解:
    (1) 选取适当的初值x0;
    (2) 确定迭代格式,即建立迭代关系,需要将方程f(x)=0改写为x=φ(x)的等价形式;
    (3) 构造序列x0,x1,…,xn,即先求得x1=φ(x0),再求x2=φ(x1)…如此反复迭代,就得到一个数列x0,x1,…,xn,若这个数列收敛,即存在极值,且函数φ(x)连续,则很容易得到这个极限值x就是方程f(x)=0,x=lim(k→无穷)xk的根。

  2. 完整代码分析

#include "stdafx.h"
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-8
using namespace std;
const int  maxn = 100;//maxn为迭代次数
double x[10], y[10];

int main()
{
	for (int i = 1; i <= 4; i++)
		x[i] = 0;  //初始近似根
		int cnt = 0;
	double c = 0;
	do {
		for (int i = 1; i <= 4; i++)
			y[i] = x[i];
		for (int i = 1; i <= 4; i++)
		{
			x[1] = (6 + x[2] - 2 * x[3]) / 10;
			x[2] = (25 + x[1] + x[3] - 3 * x[4]) / 11;
			x[3] = (-11 - 2 * x[1] + x[2] + x[4]) / 10;
			x[4] = (15 - 3 * x[2] + x[3]) / 8;
		}//按特定的方程计算新的近似根
		c = 0;
		for (int i = 1; i <= 4; i++)
			c += (fabs(y[i] - x[i]));//c要每次重新设初值为0
	} while (c>eps&&cnt<maxn);
	//输出方程的解
	for (int i = 1; i <= 4; i++)
		printf("x%d = %.4lf\n", i, x[i]);
    return 0;
}

三:迭代算法要解决三个方面的问题

  • 迭代变量的确定

    • 在可以用迭代算法解决的问题中,至少存在一个直接或间接不断由旧值递推出新值的变量,称为迭代变量。
  • 建立迭代关系式

    • 迭代关系式,是指如何从变量的前一个值推出其下一个值的公式(或关系)。
  • 对迭代过程进行控制

    • 迭代过程的控制通常分为两种情况:

      • 所需的迭代次数是个确定的值,可以计算出来,这时,可以使用一个固定的循环来控制迭代过程。

      • 所需的迭代次数无法确定。这时,应进一步分析结束迭代过程的条件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值