【程序基础】迭代法

基本思想

迭代法其实就是一种使用一个确定的数学模型关系,通过旧的值不断演算出新值从而不断接近最好问题的答案。

斐波那契数列

斐波那契是一个常见的数学问题。
使用迭代法实现一个斐波那契数列
斐波那契数列为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;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值