出几道有关迭代 递归的题以供学习参考
简单的说:递归函数以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];
}