基本思想
迭代法其实就是一种使用一个确定的数学模型关系,通过旧的值不断演算出新值从而不断接近最好问题的答案。
斐波那契数列
斐波那契是一个常见的数学问题。
使用迭代法实现一个斐波那契数列
斐波那契数列为1、1、2、3、5、8、13、21、34
步骤1,建立数学模型
步骤2,使用数学模型不断进行迭代得到新的变量
步骤3,控制迭代得出结果
代码编写:
class Fibonacci
{
public:
//输出斐波那契数列第n个数
int Fbnci(int n)
{
//1.建立数学模型,斐波那契数列的关系为a1=1,a2=2,an = an-1 + an - 2
int a1 = 1,a2 = 1,an = a1 + a2;
//2.对数学关系不断进行数学关系迭代,最后控制迭代
for(int i = 2;i < n;i++)
{
an = a1 + a2;
a1 = a2;
a2 = an;
}
//输出答案
return an;
}
};
最大公约数
//计算两个数的最大公约数
//这里采用辗转相除法。
//公理,两个非负数的最大公约数,必然是等于比较大的数对比较小的数进行取余,
//结算出结果把比较大的数赋值为比较小的数,最小的数赋值成取余的数,再进行多次迭代
//直到计算较小的值为0时迭代结束,返回较大的数的值
//公式 gcd(a,b) = gcd(a,a mod b) 且 a > b
int gcd(int a,int b){
if(a < b){
swap(a,b);
}
while (b > 0)
{
int tmp = a % b;
a = b;
b = tmp;
}
return a;
}
猴子摘桃(倒推法)
//猴子摘桃案例,假设猴子第一天摘了若干个挑子,每天吃剩下数量的一半多一个,第十天的时候剩下1个
//请问猴子第一天摘了多少颗桃子
//公式 a10 = (a9 + 1) * 2 ,i是第几天的代指
int getFirstCnt(int n,int cnt,int i)
{
if(n <= i){
return cnt;
}
int ai = cnt,an;
for(int j = n;j>0;j--)
{
an = (ai + 1) * 2;
ai = an;
}
return an;
}
牛顿迭代求解
//求解函数的根,求ax^3 + bx^2 + xc + d再x=1附近的根
//使用牛顿迭代法进行求解。
//假设函数式为f(x) = ax^3 + bx^2 + xc + d。则f’(x)的斜率为 f’(x) = 3ax^2 + 2bx + c
//假设x1和x0足够接近时,便认为x0和x1是同一个点,则有
//确认公式 x1 = x0 - f(x0) / f’(x0)
int getZeroPoint(int a,int b,int c,int d)
{
int x0 = 1,x1;
do
{
int f0 = a * x0^3 + b * x0 ^ 2 + c * x0 + d;
int f1 = 3 * a * x0 ^ 2 + b * x0 + c;
x1 = x0 - f0 / f1;
}while (abs(x0 - x1) < 1E-4);
return x1;
}