1. 程式人生 > >4GL演算法【列舉法-百錢買百雞,遞迴法-小猴吃棗】

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個