4GL演算法【列舉法-百錢買百雞,遞迴法-小猴吃棗】
阿新 • • 發佈:2019-02-07
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個