设为首页 加入收藏

TOP

递推和迭代的比较(一)
2019-06-14 20:07:54 】 浏览:115
Tags:比较

      迭代是一种不断用变量的旧值推出新值的过程。例如,程序设计中常用到的计数cnt=cnt+1(或cnt++),就是用变量cnt的值加上1后赋值给cnt;对k的求和s=s+k,就是用变量s的值加上k后赋值给s。这种用变量cnt、s的新值取代旧值的过程,实际上就是迭代。

      递推实际上也是根据递推关系式不断推出新值的过程,与迭代有很多共同之处。很多迭代过程可以应用递推来解决;反过来,很多递推过程也可以应用迭代来解决。

      例如,下面的水手分椰子问题,既可以采用递推法求解,也可以用迭代法求解。

【例1】水手分椰子

      五个水手来到一个岛上,采了一堆椰子后,因为疲劳都睡着了。一段时间后,第一个水手醒来,悄悄地将椰子等分成五份,多出一个椰子,便给了旁边的猴子,然后自己藏起一份,再将剩下的椰子重新合在一起,继续睡觉。不久,第二名水手醒来,同样将椰子等分成五份,恰好也多出一个,也给了猴子。然后自己也藏起一份,再将剩下的椰子重新合在一起。以后每个水手都如此分了一次并都藏起一份,也恰好都把多出的一个给了猴子。第二天,五个水手醒来,发现椰子少了许多,心照不宣,便把剩下的椰子分成五份,恰好又多出一个,给了猴子。问原来这堆椰子至少有多少个?

      (1)编程思路1。

       应用递推来求解,按时间来实施递推。

      设第i个水手藏椰子数为y(i)(i=1、2、…、5)个,第二天5个水手醒来后各分得椰子为y(6)个,则原来这堆椰子数为

    x=5*y(1)+1

      1)如何求取y(1)呢?

      由于第二个水手醒来所面临的椰子数为4y(1),同时也为5y(2)+1,于是有

             4*y(1)=5*y(2)+1

       同样,y(2)与y(3)之间的关系为:4*y(2)=5*y(3)+1

       一般地,有递推关系:4*y(i)=5*y(i+1)+1  (i=1、2、…、5)

      2)递推的初始(边界)值如何确定?

      问题本身没有初始(边界)条件限制,只要求上面5个递推关系式所涉及的6个量y(i)都是正整数。也就是说,若有6个整数y(i)满足5个方程4*y(i)=5*y(i+1)+1  (i=1,2,…,5),即为所求的一个解。

      3)采用顺推法求解。

      将递推式变形为从y(i)推出y(i+1)的形式

            y(i+1)=(4*y(i)-1)/5   (i=1,2,…,5)  

      首先y(1)赋初值k后推出y(2),由y(2)推出y(3),…,依此经5次递推得y(6)。如果某一次推出的不是整数,则中止继续往后推,k增1后赋值给y(1),从头开始。

      这样按时间顺序从前往后递推,若每次递推所得都是整数,则找到了解,打印输出。

      为保证推出的y(i)为整数,则要求4*y(i-1)-1能被5整除(即前一个水手藏起一份后,剩下的4份能够给猴子一个,再被分成五份)。因此,可确定最小的k值为4,即y(1)赋初值4;若在递推过程中,某次y(i)不为整数,则重新赋y(1)从头再来,为保证4*y(1)-1能被5整除,因此 k 的增量可设置为5。

      (2)源程序1。

#include <iostream>

using namespace std;

int main()

{

    int i,k,x,y[7];

    k=4;  y[1]=k;

    i=2;

    while (i<=6)

    {

       if ((4*y[i-1]-1)%5!=0)          

          {

                 k=k+5;  y[1]=k; i=2;    // 若y(i)不是整数,k增1重试

          }

          else

          {

                 y[i]=(4*y[i-1]-1)/5;   // 递推求后一个水手藏起的椰子y(i)

           i++;

          }

       }

    x=5*y[1]+1;

    cout<<"原有椰子至少"<<x<<"个。"<<endl;

    for (i=1; i<=5; i++)

              cout<<"第 "<<i<<" 个水手面临椰子 "<<5*y[i]+1

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇模板<最小生成树> 下一篇迭代(二):迭代法求方程的根

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目