迭代,递归的题目(转)
出几道有关迭代 递归的题以供学习参考
简单的说:递归函数以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-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];
}
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号