一:递推法
兔子繁殖
- 问题:
一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问1年中每个月各有多少对兔子。 - 分析
一对兔子从出生后第三个月开始每月生一对小兔子,第三个月以后每月除了有上一个月的兔子外,还有新下小兔子。则第三个月以后兔子的对数就是前两个月兔子对数的和。繁殖过程如下。
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…到此发现这个数列就是著名的斐波那契数列。 - 完整代码
#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;
}
二: 倒推法
猴子吃桃问题
- 问题:
一只猴子摘了若干桃子,每天吃现有桃子的一半多一个,到第十天就只有一个桃子了,问猴子最初共摘了多少桃子?
数学模型:
每天的桃子数为:a10=1,a9=(1+a10)*2,a8=(1+a9)*2,…
递推公式为:ai=(1+ai+1)*2 i=9,8,7,6,…,1 - 算法设计
由于每天的桃子数只依赖前一天的桃子数,所以用一个迭代变量代表桃子个数就可以了。 - 完整代码
#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;
}
求方程组的解
- 构建方程组
10x1-x2+2x3=6
-x1+11x2-x3+3x4=25
2x1-x2+10x3-x4=-11
3x2-x3+8x4=15
-
分析
迭代法解方程的实质是按照下列步骤构造一个序列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的根。 -
完整代码分析
#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;
}
三:迭代算法要解决三个方面的问题
-
迭代变量的确定
- 在可以用迭代算法解决的问题中,至少存在一个直接或间接不断由旧值递推出新值的变量,称为迭代变量。
-
建立迭代关系式
- 迭代关系式,是指如何从变量的前一个值推出其下一个值的公式(或关系)。
-
对迭代过程进行控制
-
迭代过程的控制通常分为两种情况:
-
所需的迭代次数是个确定的值,可以计算出来,这时,可以使用一个固定的循环来控制迭代过程。
-
所需的迭代次数无法确定。这时,应进一步分析结束迭代过程的条件。
-
-