迭代(一)

迭代这个看似熟悉,又不太熟悉的概念,碰到过好多次了,于是,今天查阅资料,看了一片有了点意识。

资料来自百度百科,当然,我这指的是编程中的迭代

编程中的迭代

有些国外的教材,如《C++ Primer》第四版的中文版,会把iterative翻译成迭代。

 

iterative是反复的意思,所以,有时候,迭代也会指循环执行,反复执行的意思。

 

迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:

第一确定迭代变量  

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

第二建立迭代关系式  

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

第三对迭代过程进行控制

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

例 1 : 一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到第 12 个月时,该饲养场共有兔子多少只?

以下是引用片段:

 

  u 1 = 1 , u 2 = u 1 + u 1 × 1 = 2 , u 3 = u 2 + u 2 × 1 = 4 ,……

 

  根据这个规律,可以归纳出下面的递推公式:

 

  以下是引用片段:

 

  u n = (u n - 1) × 2 (n ≥ 2)

 

  对应 u n 和 u n - 1 ,定义两个迭代变量 y 和 x ,可将上面的递推公式转换成如下迭代关系:

 

  以下是引用片段:

 

  y=x*2

 

  x=y

 

  让计算机对这个迭代关系重复执行 11 次,就可以算出第 12 个月时的兔子数。参考程序如下:

x=1;

for(int i=2;i<=12;i++){

        y=x*2;

        x=y;

}

验证谷角猜想。

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

 

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

 

  分析: 定义迭代变量为 n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时, n=n/2 ;当 n 为奇数时, n=n*3+1 。用 QBASIC 语言把它描述出来就是:

 

  以下是引用片段:

 

  if n 为偶数 then

 

  n=n/2

 

  else

 

  n=n*3+1

 

  end if

这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为: n=1 。参考程序如下:

cls

 

  input "Please input n=";n

 

  do until n=1

 

  if n mod 2=0 then

 

  rem 如果 n 为偶数,则调用迭代公式 n=n/2

 

  n=n/2

 

  print "—";n;

 

  else

 

  n=n*3+1

 

  print "—";n;

 

  end if

 

  loop

 

  end

自己编写的JAVA 程序:

int x=100;
  int y=x/2;
  while(y!=1){
   if(y%2==0){
    y=y/2;
   }else{
    y=y*3+1;
   }
  }
  System.out.println(y);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值