算法系统学习-正的麻烦反着来呗!(迭代算法-倒推法)

简介: 该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点

倒推法


所谓的倒推法,是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法,正向推理比较麻烦时,反而在逆向推理中更加巧妙地解决问题。


Case1猴子吃桃问题


一只小猴子摘了若干个桃子,每天吃总数的一半多一个,到第十天的时候就剩一个桃子,请问原来有多少桃子?

建立数学模型:

每天的桃子总数为

a10=1, a9=(1+a10)*2, a8=(1+a9)*2, .....

算法设计:

由于每天的桃子数只依赖前一天的桃子数,所以用一个迭代变量代表桃子个数就可以了

ai=(1+ai)*2 i 取值为9,8,7,6,5,4....1

main(){
  int i,a;
    a=1;
    for(i=9;i>=1;i--){
    a=(a+1)*2;
        cout<<a;
    }
}
复制代码


由一个简单的小case对倒推法有一个简单的了解,让我们来看一个比较有趣的数学问题--“杨辉三角”


Case2杨辉三角(使用一维数组):


网络异常,图片无法展示
|

关于杨辉三角问题,具体我就不进行过多的阐述了,因为想必你们的体育老师应该也讲过吧。

算法分析:

第i层有i列需要求解的i个数据,若从第一列开向后计算求i行时,由于用一个一维数组存储,每求出一个数将覆盖掉第i-1行对应的存储的值。这 将导致下一个数无法计算。而倒推法却不会,因此迭代表达式为:

A[1]= A[i]=1

A[j]=A[j]+A[j-1] j=i-1 ,i-2, i-3.....2

i行 i-1行 i-1行

为输出方便可以转化一下格式:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1


算法如下:

main(){
  int n,i,j, a[100];
    cin>>n;
    cout<<"1";cout<<"/n";
    a[1]=a[2]=1;
    cout<<a[1]<<a[2];
    for(i=3;i<=n;i++){
    a[1]=a[i]=1;
       for(j=i-1;j>1;j--){
       a[j]=a[j]+a[j-1];
       }
        for(j=1;j<=i;j++){
            cout<<a[j];
        }
    }
  cout<<"/n";
}
复制代码


迭代法解方程


Case1:求ax^3+bx^2+cx+d=0方程根的算法,系数a,b,c,d的值依次是1,2,3,4,由主函数输入。求x在1附近的一个实根并输出。

拓展:牛顿迭代法

牛顿迭代法又称切线法,它比一般的迭代法有更高的收敛速度。首先选择一个接近的函数f(x)零点的x0,计算对应的f(x0)和切线斜率f'(x) (f'(x)表示是函数的导数,求导是高数的内容不具体详细讲解,不懂的可以百度)然后计算穿过点(x0,f(x0))且斜率f'(x)的直线方程:

y=f(x0)+f'(x)(x-x0)

和x轴的交点的x坐标,也就是求如下方程的解:

0=f(x0)+f'(x)(x-x0)


迭代公式可以简化成:xn+1=xn-f(xn)/f'(n)

这就是有名的牛顿迭代公式,已经证明了,如果f'连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个临近区域内,那么牛顿法必定收敛(关于收敛性也是高数的内容,就不详细讲解)

因此看完关于牛顿迭代,可得出算法如下:

main(){
  float a,b,c,d,fx;
    cout<<'系数a,b,c,d:'
    cout>>a>>b>>c>>d;
    fx=f(a,b,c,d);
    cout<<'方程的根'<<fx;
}
float a,b,c,d;
fx=f(a,b,c,d);
{
float x1=1,x0,f0,f1;
    do{
    x0=x1;
        f0=((a*x0+b)*x0+c)*x0+d;
        f1=(3*a*x0+2*b)*x0+c;
        x1=x0-f0/f1;
    }while(fabs(x1-x0)>=1e-4){
    return(x1);
    }
}


目录
相关文章
|
5天前
|
机器学习/深度学习 人工智能 算法
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
27 0
|
13天前
|
机器学习/深度学习 监控 算法
【软件设计师】常见的算法设计方法——迭代法
【软件设计师】常见的算法设计方法——迭代法
|
15天前
|
机器学习/深度学习 人工智能 算法
食物识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
食物识别系统采用TensorFlow的ResNet50模型,训练了包含11类食物的数据集,生成高精度H5模型。系统整合Django框架,提供网页平台,用户可上传图片进行食物识别。效果图片展示成功识别各类食物。[查看演示视频、代码及安装指南](https://www.yuque.com/ziwu/yygu3z/yhd6a7vai4o9iuys?singleDoc#)。项目利用深度学习的卷积神经网络(CNN),其局部感受野和权重共享机制适于图像识别,广泛应用于医疗图像分析等领域。示例代码展示了一个使用TensorFlow训练的简单CNN模型,用于MNIST手写数字识别。
41 3
|
18天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
18天前
|
算法
【数据结构与算法 11,高并发系统基础篇
【数据结构与算法 11,高并发系统基础篇
|
20天前
|
机器学习/深度学习 算法 网络架构
什么是神经网络学习中的反向传播算法?
什么是神经网络学习中的反向传播算法?
17 2
|
20天前
|
机器学习/深度学习 算法
算法人生(5):从“元学习”看“战胜拖延”(没兴趣版)
元学习是让机器学会学习策略,适应新任务的机器学习范式。通过定义任务分布、采样任务、内在和外在学习循环来优化模型,增强其跨任务适应性和泛化能力。面对不感兴趣的任务导致的拖延,我们可以借鉴元学习的思路:重新评估任务价值,寻找通用兴趣点;设定奖励激发行动;改变环境以提高执行力。通过调整视角、自我激励和优化环境,可以克服因无兴趣而产生的拖延。
|
20天前
|
机器学习/深度学习 存储 算法
算法人生(4):从“选项学习”看“战胜拖延”(担心失败版)
选项学习是强化学习的一种策略,通过定义、学习和切换选项来解决复杂任务,将大任务分解为可重复使用的子任务,以提高学习效率和适应性。面对因担心失败而拖延的问题,我们可以借鉴选项学习的思想:将大任务拆分为小目标,正视失败作为成长的一部分,回顾成功经验并寻求支持。通过这种方式,逐步增强自信,降低拖延现象。
|
20天前
|
算法 网络协议
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
24 1
|
20天前
|
机器学习/深度学习 算法
应用规则学习算法识别有毒的蘑菇
应用规则学习算法识别有毒的蘑菇