迭代与递归迭代

本文探讨了在洪水计算中使用迭代和递归的方法。迭代通过不断更新变量来逼近答案,避免了递归可能导致的空间浪费和堆栈溢出。文中提供了迭代和递归实现的代码示例,用于计算峰值流量、回流参数和汇流时间。
摘要由CSDN通过智能技术生成

迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值