迭代,递归的题目(转)

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

简单的说:递归函数以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];
}

原文地址:https://www.cnblogs.com/ganmk/p/1328996.html