常用的循环设计方法

  **穷举法**
基本思想是:首先依据题目的部分条件确定答案的大致范围,然后在此范围内对所有的可能性逐一验证,直到全部情况验证完毕。若某个情况验证符合题目条件,则为本题的一个答案;若全部情况验证完后均不符合题目条件,则问题无解,枚举的思想作为一个算法能解决许多问题。

例题一、公鸡5元一只,母鸡3元一只,小鸡1元三只。问100元买100只鸡,公鸡,母鸡,小鸡各多少只。
题目分析:设公鸡X只,母鸡Y只,小鸡Z只。
X+Y+Z=100
5X+3Y+Z/3=100
用穷举法求解,取值范围0<=X<=20、0<=Y<=33、0<=Z<=100

#include<iostream.h>
void main()
{
    int x,y,z,i=1;//i是序号,x是公鸡个数。
    for(x=0;x<=20;x++)
        for(y=0;y<=33;y++)
        {
            z=100-x-y;
            if(15*x+9*y+z==300)//由于整数除法运算,所以将方程式中5X+3Y+Z/3=100全部换成整数。
            cout<<i++<<" "<<x<<" "<<y<<" "<<z<<endl;
        }
}

递推法

从已知的初始条件出发,逐步推出题目所要求的各中间结果和最后结果的算法

例题一、求n!
n!=1*2*3*……*n
首先求1!,然后计算2*1!,则推出2!;进一步推出3!,4!, 、、、,n!

#include<iostream.h>
void main()
{
    int i,n;
    int fact=1;
    cin>>n;
    for(i=1;i<=n;i++)
        fact=fact*i;
    cout<<n<<"!="<<fact;
}

例题二、求数列:第1、第2个数为1、从第3个数开始每个数是前两个数之和。其数列为:1、1、2、3、5、8……..
题目分析,如何求数列的前n项和。

#include<iostream.h>
void main()
{
    int f1=1,f2=1;
    int n,i,f3;
    cin>>n;
    cout<<f1<<" "<<f2<<" ";
    for(i=3;i<=n;i++)
    {
        f3=f1+f2;
        cout<<f3<<" ";
        if(i%5==0)
        cout<<endl;
        f1=f2;
        f2=f3;

    }
}

迭代法

迭代法是常用的数值计算方法,所谓迭代是指重复执行一组语句,每次执行这组语句时,都从变量的原值推出它的一个新值。
在计算领域,常遇到代数方程 f(x)=0 或微分方程的求解问题 。有很多方程很难或无法像一元二次方程的求解公式那样去求解。因此,只用数值计算方法求出近似解若近似解的误差可以估计控制,且迭代的次数也可以接受,他就是一种近似求解的方法,既可以用来求解代数方程,又可以用来求解微分方程,使一个复杂问题求解过程转为相对简单的迭代算式的重复执行过程,

例题一、利用牛顿迭代法求方程2x^3-4x^2+3x-6=0在1.5附近的解
题目分析:
牛顿迭代法称为牛顿切线法,方法是在曲线上取一个初始点A(x0,f(x0)),过点A作函数f(x)的曲线的切线与x轴交于x1,则切线的斜率为f’(x0)=f(x0)/(x0-x1),x1=x0-f(x0)/f’(x0),显然,所得的x1更接近方程的根。继续过点B(x1,f(x1))作曲线的切线,与x轴交于x2。。。。依次重复上述过程,可得迭代公式:x(k+1)=xk-f(xk)/f’(xk).
当给定根的初始值x0和允许误差&后,就可以根据以上迭代公式得到一个符合误差要求的近似实根,
具体步骤:

1、已知x0,求x1=x0-f0/f'。f(x0)=2xo^3-4x0^2+3x0-6,
f'(x0)=6x0^2-8x0+3
2、如果x0x1之间的误差小于或者等于指定误差范围1e-5,则认为x1就是方程的根,否则继续迭代,把新求得的x1作为x0,准备用此新的x0再去求出一个新的x1.
#include<iostream.h>
#include<math.h>
void main()
{
    double x0,x1=1.5;
    double f0,f1;
    do{
        x0=x1;
        f0=2*x0*x0*x0-4*x0*x0+3*x0-6;
        f1=6*x0*x0-8*x0+3;//f1=f'0
        x1=x0-f0/f1;
    }
    while(fabs(x0-x1)>1e-5);
    cout<<x1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值