迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B.
递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出.
递归:程序调用自身的编程技巧称为递归,是函数自己调用自己,它把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量。由于递归引起一系列的函数调用,并且有可能会有一系列的重复计算,递归算法的执行效率相对较低.
迭代
#include <iostream.h>
#include <math.h>
#include <string.h>
//float数据类型只有6(-)、7(+)位有效数字,double数据类型为15或16位有效数字
void main()
{
double L=14.35;//河长,单位为KM
double F=56.487521;//流域面积
double J=0.013;//河道比降,单位为KM2
double h24=471.2;//1%频率下24小时净雨总量
double Qm[100],m,h[100];;//Qm峰值流量,m回流参数M稳,h为净雨
double T[100];//汇流时间试算初值设定
h[0]=h24,T[0]=4.0;
Qm[0]=0.278*h24/T[0]*F;
//1%暴雨频率下
double n1_6=0.459962831,n6_24=0.515012195;//1<T<=6时,n取n1_6;6<T<=24时,n取n6_24
double Ra=L/pow(J,1/3.);//易错点,用L/J^(1/3)将会导致计算错误
if(Ra>90)
m=0.114*pow(Ra,0.464);//m等于M稳
else
m=0.6*pow(Ra,0.1);
for(int i=1;i<100;i++)
{
Qm[i]=0.278*h[i-1]/T[i-1]*F;
h[i]=h[0]*pow(T[i-1]/24,1-n1_6);
T[i]=0.278*Ra/m/pow(Qm[i],0.25);
if(fabs(Qm[i]-Qm[i-1])<=0.01&&fabs(h[i]-h[i-1])<=0.01&&fabs(T[i]-T[i-1])<=0.01)
{ cout<<"Qm["<<i<<"]="<<Qm[i]<<endl;
cout<<"h["<<i<<"]="<<h[i]<<endl;
cout<<"T["<<i<<"]="<<T[i]<<endl;
break;
}
}
return;
}
递归迭代
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
//float数据类型只有6(-)、7(+)位有效数字,double数据类型为15或16位有效数字
int huiliu(double (&Qm)[100],double (&T)[100],double (&h)[100],double F,double m,double Ra,double n1_6,int n)
{
Qm[n]=0.278*h[n-1]/T[n-1]*F;
h[n]=h[0]*pow(T[n-1]/24,1-n1_6);
T[n]=0.278*Ra/m/pow(Qm[n],0.25);
if(fabs(Qm[n]-Qm[n-1])<=0.01&&fabs(h[n]-h[n-1])<=0.01&&fabs(T[n]-T[n-1])<=0.01)
{cout<<setiosflags(ios::fixed)<<setw(1)<<setprecision(6)<<"Qm["<<n<<"]="<<Qm[n]<<endl;
cout<<setiosflags(ios::fixed)<<setw(1)<<setprecision(6)<<"h["<<n<<"]="<<h[n]<<endl;
cout<<setiosflags(ios::fixed)<<setw(1)<<setprecision(6)<<"T["<<n<<"]="<<T[n]<<endl;
return n;
}
if(n<=100)
huiliu(Qm,T,h,F,m,Ra,n1_6,n+1);
else//迭代超出了100步
{ cout<<"迭代超出了100步,未达到0.01的精度目标,结果输出如下:"<<endl;
cout<<setiosflags(ios::fixed)<<setw(1)<<setprecision(6)<<"Qm["<<n<<"]="<<Qm[n]<<endl;
cout<<setiosflags(ios::fixed)<<setw(1)<<setprecision(6)<<"h["<<n<<"]="<<h[n]<<endl;
cout<<setiosflags(ios::fixed)<<setw(1)<<setprecision(6)<<"T["<<n<<"]="<<T[n]<<endl;
return n;}
}
void main()
{double L=14.35;//河长,单位为KM
double F=56.487521;//流域面积
double J=0.013;//河道比降,单位为KM2
double h24=471.2;//1%频率下24小时净雨总量
double Qm[100],m,h[100];//Qm峰值流量,m回流参数M稳,h为净雨
double T[100];//汇流时间试算初值设定
h[0]=h24,T[0]=4.0;
Qm[0]=0.278*h24/T[0]*F;
//1%暴雨频率下
double n1_6=0.459962831,n6_24=0.515012195;//1<T<=6时,n取n1_6;6<T<=24时,n取n6_24
double Ra=L/pow(J,1/3.);//易错点,用L/J^(1/3)将会导致计算错误
if(Ra>90)
{m=0.114*pow(Ra,0.464);}//m等于M稳
else
m=0.6*pow(Ra,0.1);
int n=1;
n=huiliu(Qm,T,h,F,m,Ra,n1_6,n);
cout<<setiosflags(ios::fixed)<<setw(1)<<setprecision(6)<<"h[14]="<<h[14]<<endl;
}