2012-11-09 31 views
1

我在Scheme中實現此程序時遇到了一些麻煩,儘管我認爲我在這方面達到了90%。不幸的是,我需要對此有點模糊,因爲這是一項家庭作業。在計劃中返回一個真實值

我需要一個列表作爲輸入,生成列表的所有可能的子序列,並返回符合特定條件的一個列表。我已經完成了代碼生成列表的所有子序列,並且還說明某個子集是否是解決方案。然而,我有計劃退還該解決方案的麻煩。我的代碼基本上是這樣的,現在

(define (function rest_of_list subsequence) 
    (if (subsequence is a solution) subsequence) 
    (if (> (length rest_of_list) 0) (function (cdr rest_of_list) (append subsequence (car rest_of_list)))) 
    (if (> (length rest_of_list) 0) (function (cdr rest_of_list) subsequence))) 

這段代碼應該做的是對列表中的每個元素,它的分支遞歸地在兩個方向。在一個方向上,它將(汽車rest_of_list)添加到子序列中並繼續向下。在另一個方向它忽略(汽車rest_of_list)並繼續下去。只要它找到一個可接受的子序列,它就會返回它,這就是函數function的結果。現在我只是得到空白輸出。我有點理解我爲什麼猜測,但不足以解決這個問題。

回答

1

這是一個有點棘手,不看你的實現的具體細節,但我會做這些方針的東西:

(define (function rest_of_list subsequence) 
    (cond ((null? rest_of_list) 
     '()) 
     ((subsequence is a solution) 
     subsequence) 
     (else 
     (combine (function (cdr rest_of_list) (append subsequence (car rest_of_list))) 
        (function (cdr rest_of_list) subsequence))))) 

有趣的部分是如何combine兩個分支,它可能是簡單作爲cons。另請注意,基本情況可能會丟失:如果列表的其餘部分爲空,會發生什麼情況?

+1

這絕對幫助我看到我做錯了什麼。看起來我現在修好了。需要在遞歸的每個步驟中明確定義哪個遞歸分支導致有效答案(或者如果兩者都選擇一個),而不是期望Scheme在程序語言返回true時返回。 – Outback