迭代

来源:互联网 发布:淘宝分享好友链接代码 编辑:程序博客网 时间:2024/05/17 07:52

求斐波那契数列:

#include<stdio.h>int main(){int a,b,c;a=1;b=2;int n;scanf("%d",&n);for(i=3;i<=n;i++){c=a+b;a=b;b=c;}printf("%d",c);}

这个方法属于迭代,比用递归求斐波那契快些

普通递归:

#include<stdio.h>int febo(int n){if(n==1)return 1;else if(n==2)return 2;elsereturn febo(n-1)+febo(n-2);}int main(){int n;scanf("%d",&n);printf("%d",febo(n));}

这个重复计算了很多项,时间复杂度高,可以改进些,把之前计算过的项保存到数组,后面再计算的时候直接取值而非递归重复计算

改进递归:

#include<stdio.h>#include<string.h>int temp[1000];temp[1]=1;temp[2]=2;int febo(int n){if(temp[n]!=0)return temp[n];else{int avg;avg=febo(n-2)+febo(n-1);temp[n]=avg;return avg;}}int main(){memset(temp,0,sizeof(temp));int n;scanf("%d",&n);printf("%d",febo(n));}

都不如最开始的那个迭代好!


迭代的第二个例子:牛顿迭代求方程解

1.把方程f(x)=0改写成x=g(x)

2. 给定一个近似解x0,令x=x0,求g(x),若g(x)与x0差值小于精确度,则停止判断,方程解取x0,否则x=g(x),与g(x)再次比较

3.可能为死循环,无解,与近似值的选取有关,选的不好可能找不到解

#include<stdio.h>#include<math.h>//牛顿法解3x^2-4x=1,精确度0.1float x0=1.0;float Ep=0.1;float g(float x){return (3*x*x-1)/4;}float solve(){float x=x0;x0=g(x);while(fabs(x-x0)>Ep){x=x0;x0=g(x);}return x;}int main(){printf("%f",solve());return 0;}

这里的初值如果用2.0的话,就找不到解了


0 0