4GL算法【列举法-百钱买百鸡,递归法-小猴吃枣】

1. 滴水不漏——列举法破解难题

示例:百钱买百鸡
公鸡3元每只,母鸡5元每只,小鸡1元3只,一百元钱买一百只鸡。请求出公鸡,母鸡和小鸡的数目?
编程简析:
我们做最极端的假设,公鸡可能是0-100,母鸡也可能是0-100,小鸡还可能是0-100,
将这三种情况用循环套起来,那就是1000000种情况。这就是列举法。
为了将题目再简化一下,我们还可以对上述题目进行一下优化处理:

假设公鸡数为x,母鸡数为y,则小鸡数是100-x-y,也就有了下面的方程式:
3*x+5*y+(100-x-y)/3=100
从这个方程式中,我们不难看出大体的情况:公鸡最多有33只,最少是没有,即x的范围是0-33;母鸡最多20只,最少0只,即母鸡的范围是0-20;有了公鸡母鸡,小鸡数自然就是100-x-y只。可能的方案一共有34*21种,在这么多的方案中,可能有一种或几种正好符合相等的条件。电脑怎样工作呢?计算机事实上就是将上述34*21种方案全部过滤一遍,找出符合百钱买百鸡条件的(也即上式),只要符合,这就是我们要的输出结果。

MAIN  
    DEFINE    x,y,z       INTEGER
    DEFINE    l_result    string  
    FOR x=0 TO 33 STEP+1  
       FOR y=0 TO 20 STEP+1 
         LET z= 100-x-y
         IF 3*x+5*y+z/3 =100 THEN
            LET l_result = "公鸡,母鸡和小鸡数分别为:",x USING '####',y USING '####', z USING '####'
            DISPLAY l_result
         END IF 
       END FOR    
    END FOR  
END MAIN
结果如下:
</u1/topprod/topcust/cxm/42m> fglrun cxm_cxmi999t.42m
公鸡,母鸡和小鸡数分别为:   4  12  84
公鸡,母鸡和小鸡数分别为:  11   8  81
公鸡,母鸡和小鸡数分别为:  18   4  78
公鸡,母鸡和小鸡数分别为:  25      75


2. 镜里照镜——递归法破解难题

示例:小猴吃枣

小猴第一天摘下若干枣子,当即吃掉了一半,不过瘾又多吃了一个;第二天吃了剩下的一半又多吃了一个;以后每一天都吃了前一天剩下的一半多一个。到第十天小猴再想吃时,见到只剩下一只枣子了。问第一天这堆枣子有多少?

从上题中我们可看到一个令人欣喜的规律,第十天为1,第九到第一天中后一天与1的和的两倍与前一天相等。下面就对这一规律做了描述:

DEFINE g_result    INTEGER
MAIN  
    DEFINE    i           INTEGER
    DEFINE    l_result    INTEGER
       FOR i=10 TO 1 STEP -1  
          CALL monkey(i) RETURNING l_result
           LET g_result = l_result
           DISPLAY "第",i USING '##'," 天这堆枣的个数为:",g_result USING '####个'
       END FOR          
END MAIN

FUNCTION monkey(p_num)
DEFINE p_num,monkey  INTEGER
   IF p_num >=10  THEN
   	 LET monkey = 1 
   ELSE
     LET monkey = 2 * (g_result + 1)
   END IF 
  RETURN monkey
END FUNCTION
结果如下:
</u1/topprod/topcust/cxm/42m> fglrun cxm_cxmi999t.42m
第10 天这堆枣的个数为:   1个
第 9 天这堆枣的个数为:   4个
第 8 天这堆枣的个数为:  10个
第 7 天这堆枣的个数为:  22个
第 6 天这堆枣的个数为:  46个
第 5 天这堆枣的个数为:  94个
第 4 天这堆枣的个数为: 190个
第 3 天这堆枣的个数为: 382个
第 2 天这堆枣的个数为: 766个
第 1 天这堆枣的个数为:1534个


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值