【引】 迭代与递推算法

来源:互联网 发布:闪凌网络是真的吗 编辑:程序博客网 时间:2024/06/05 15:58

http://gsqls.blog.163.com/blog/static/459712182009111010569931/

一、实验名称:

实验A:迭代与递推算法

二、实验目的:

1、掌握迭推算法的概念及适应范围

2、熟悉迭推算法的设计原理

三、实验器材:

1、计算机

四、实验内容:

迭代与递推算法:基本思路实质是相同的,即不断利用已知的数据推出未知的数据,再利用推出的数据及以前的数据继续推导,直到推出所要的结果为止。

这种算法的关键点有如下几方面:

1)确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

2)建立迭代关系式。所谓迭代关系式,指如何从变量的前一个(或一组)值推出其下一个(或一组)值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

3)对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

1、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第30天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

根据题意,设Si为第i天所拥有的桃子,则前后相邻两天的桃子数有如下关系:

\"实验A:迭代与递推算法

此时由于最后一天(第30天的)是已知的,根据上述公式可推出第29天的;而根据第29天的又可以推出第28天的……,重复上述工作,就可以推出第1天的个数。推导过程如下图:

\"实验A:迭代与递推算法

则相应算法流程如下:

\"实验A:迭代与递推算法

相应程序如下:

#include <stdio.h>

#include <stdlib.h>

#define N 30

void main()

{

int i,si,si1;

si1=1;

for(i=N-1;i>=1;i--)

{

si=2*si1+2;

si1=si;

}

printf(\"\\n%d天,则第一天的桃子数为%d\\n\",N,si);

system(\"pause\");

}

2、兔子问题:13世纪意大利数学家斐波那契在他的《算盘书》中提出这样一个问题:有人想知道一年内一对兔子可繁殖成多少对,于是筑了一道围墙把一对兔子关在里面。已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后第二个月就开始生小兔子。假如一年内没有发生死亡,则一对兔子一年内能繁殖成多少对?

说明:假设兔子不死,每生一次刚好就是一雌一雄。

现在我们寻求兔子繁殖的规律。成熟的一对兔子用记号表示,未成熟的用表示。每一对成熟的兔子经过一个月变成本身的及新生的未成熟。未成熟的一对经过一个月变成成熟的,不过没有出生新兔,这样便可画出下图:

\"实验A:迭代与递推算法

可以看出五个月兔子的对数是12358。很容易发现这个数列的特点:即从第三项起,每一项都等于前两项之和,即:

\"实验A:迭代与递推算法

人们为了纪念斐波那契,就以他的名字命名了这个数列,该数列的每一项称为斐波那契数。

斐波那契数列有许多有趣的性质,除了\"实验A:迭代与递推算法外,还可以证明它的通项公式如下:

\"实验A:迭代与递推算法

可它的每一项却都是整数。而且这个数列中相邻两项的比值,越靠后其值越接近0.618(黄金分割比值)。这个数列有广泛的应用,如树的年分枝数目就遵循斐波那契数列的规律;而且计算机科学的发展,为斐波那契数列提供了新的应用场所。

3、验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此经过有限次运算后,总可以得到自然数1。人们把谷角静夫的这一发现叫做谷角猜想

要求:编写一个程序,由键盘输入一个自然数n,把n经过有限次运算后,最终变成自然数1的全过程打印出来。

4、二分法求方程根

\"实验A:迭代与递推算法

\"实验A:迭代与递推算法

过程如下图:

\"实验A:迭代与递推算法

\"实验A:迭代与递推算法

第二题参考程序:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

double f(double x)

{

return pow(3,x)-7*x-8;

}

void main()

{

//a,b分别存放区间下界及上界,c存放区间中点,fa,fb,fc分别存放对应各点函数值,jqd存放精确度

double a=0,b=8,c,fa,fb,fc,jqd=0.01;

int count=0;//统计迭代次数

fa=f(a);

fb=f(b);

if(fa*fb==0)

if(fa==0)

printf(\"方程根为:%f\\n\",a);

else

printf(\"方程根为:%f\\n\",b);

else

if(fa*fb>0)

printf(\"所给定的范围[%f,%f]内不能保证有实根\\n\",a,b);

else

{

while(b-a>jqd)

{

count++;

c=(a+b)/2;

fa=f(a);

fc=f(c);

if(fc==0)

{

b=c;

a=c;

}

else

if(fa*fc<0)

b=c;

else

a=c;

}

printf(\"方程根为:%f,迭代次数:%d次!\\n\",c,count);

}

}

5、阿米巴用简单分裂的方式繁殖,它每分裂一次要用3分钟。将若干个阿米巴放在一个盛满营养参液的容器内,45分钟后容器内充满了阿米巴。已知容器最多可以装阿米巴2^20(2的20次方)个。试问,开始的时候往容器内放了多少个阿米巴?请编程序计算。

五、实验要求:

1、写出所有的程序,填在后面,不够加附页。

2、总结设计使用函数时的注意事项。

3、记录上机过程中所出现的相关英文信息如菜单项名称、错误提示等,查出其中文含义,并写在实验报告后面。