zoukankan      html  css  js  c++  java
  • 迭代,递归的题目(转)

    出几道有关迭代 递归的题以供学习参考

    简单的说:递归函数以n开始向初始解逼近,而迭代以初始值为基础向n步进f(n)
    1:迭代方法求方程题:函数countValue()实现下列功能:利用以下所示的简单迭代方法求方程:cos(x)-x=0的一个实根。Xn+1=cos(Xn)
    迭代步骤如下:(1)取X1初值为0.0;(2)X0=X1,把X1的值赋给X0;(3)X1=cos(X0),求出一个新的X1;(4)若X0-X1的绝对值小于0.000001,执行步骤(5),否则执行步骤(2);(5)所求X1就是方程cos(X)-X=0的一个实根,作为函数值返回

    float countValue(void)

    {
       x1=0.0;
       do
       {
          x0=x1;
          x1=cos(x0);
       }
       while(fab(x0-x1)>=0.000001)
       return x1;
    }

    2:有一头母牛,从出生4年后开始每年生一头母牛,按照此规律问n年后有几头母牛?

    分析:当年的牛=去年的牛+当年出生的新牛

            当年出生的新牛=生第一胎的牛及比她大的牛所生=4年前母牛的总数

    递归法解:

     f(n)
    {
       f(1)=f(2)=f(3)=f(4)=1;
       if(n<=4)
          return f(n);
       return f(n-1)+f(n-4);
    }

    迭代法解:

    f(n)
    {
       int x[n];//n应该在此添加一个确定的常量
      
       x[1]=x[2]=x[3]=x[4]=1;
       if(n<=4)
          return x[n];
       for(int i=5;i<=n;i++)
       {
        x[i]=f[i-1]+f[i-4];
       }
       return x[n]; 
    }   
        

    2.1:有一头母牛,从出生后开始每年生一头母牛,按照此规律问n年后有几头母牛?
    分析:当年的牛=去年的牛+当年出生的新牛=2*去年的牛
    递归法解:
    f(n)
    {
      f(0)=0;
      f(1)=1;
     
      if(n<=1)
         return f(n);
      return 2*f(n-1);
    }
    迭代法解:
    f(n)
    {
     int x[0]=0;
     int x[1]=1;
     
     int x[2];
     if(n<=1)
             return x[n];
     for(int i=2;i<=n;i++)
     {
      x[2]=2*x[1];
      x[1]=x[2];
     }
     return x[2];
    }

    2.2:有一头母牛,从出生后开始每m年生一头母牛,按照此规律问n年后有几头母牛?
    分析:k=4时从第1年开始牛数为1111222244448888。。。。。。
          套用每年生一次则此题的n年进行修改后套用2.1的解即可
         
     f2(n)
     {
      n=1+(n-1)/m;
      f(n);
     }
     
    2.3有一头母牛,从出生k年后开始每年生一头母牛,按照此规律问n年后有几头母牛?
    (k 分析:当年的牛=去年的牛+当年出生的新牛
            当年出生的新牛=生第一胎的牛及比她大的牛所生=k年前母牛的总数
           
    f3(n)
    {
     if(n<=k)
        return f3(n);  
        return f3(n-1)+f3(n-k);
    }

    2.4有一头母牛,从出生k年后开始每m年生一头母牛,按照此规律问n年后有几头母牛?
    仿照2.2
    f4(n)
    {
     n=1+(n-1)/m;
     f3(n);
    }
    3:编写函数jsValue,它的功能是:求Fibonacci数列中大于t的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为:F(0)=0,F(1)=1    F(n)=F(n-1)+F(n-2)   例如:当t=1000时,函数值为:1597

    这是道递归改迭代的题目

    退出条件 :f(n)>t则return f(n)
    修正方式:f(2)=f(0)+f(1),f(3)=f(2)+f(1).......

    f( )

    {
       int x[3];
       x[0]=0;
       x[1]=1;


       for(;;)

    {

       x[2]=x[0]+x[1];

       if(x[2]>=t)

          break;

       x[0]=x[1];

        x[1]=x[2];

    }
       return x[2];
    }


    4:
    n>0

    f(n)
    {
       n==1 return 0
       n==2 return 1
       return f(n-1)+f(n-2)
    }
    将这个递归函数以迭代函数写出


    分析:函数给出了如下信息f(1)=0,f(2)=1,f(n)=f(n-1)+f(n-2)

             递归函数以n开始向初始解逼近,而迭代以初始值为基础向n步进f(n)

    {
       int x[3];
      
       x[1]=0;
       x[2]=1;


       if(n==1)
          return x[1];
       if(n==2)
          return x[2];

       for(int i=3;i<=n;i++)
       {
          x[0]=x[1]+x[2];
          x[1]=x[2];
          x[2]=x[0];
       }
       return x[0];
    }

  • 相关阅读:
    选择排序
    java面试题08
    java面试题07
    java面试题06
    java面试题05
    oop.1
    4
    3
    Struts1中actionform和action属于MVC哪一层
    mysql查询时间段的所有数据
  • 原文地址:https://www.cnblogs.com/ganmk/p/1328996.html
Copyright © 2011-2022 走看看