2013-04-26 61 views
1

我的方案的功能看起來像這樣方案列表

(define (func1 input) 
    (let kloop ((x 6)) 
    (let ((act (string-copy (func2 input2)))) 
     (if (eq? act "") (display "null") (display act)) 
     (if (> x 0) (kloop (- x 1))))))) 

FUNC2返回存儲在行爲一些字符串。現在我必須創建這個函數返回的所有字符串的列表。在上面,我只是顯示這些字符串。我嘗試了不同的方法,但沒有任何解決方法。我試着使用append和cons。

請建議。

+0

什麼是'input2'?爲什麼'string-copy'(某些東西破壞性地修改'func2'的結果)? – GoZoner 2013-04-26 14:18:54

+0

而且,當然,顯示內容與返回內容不一樣。顯示產生對象的打印表示;返回返回對象。 – GoZoner 2013-04-26 16:50:02

回答

1

你最後if缺少其他情況下,這也正是人們所期望的函數的返回值是。

你不提你是如何試圖用appendcons,但一個共同的模式是在環路周圍傳遞一個積累參數:

(define (five input) 
    (let loop ((x 5) (outputs '())) 
    (if (> x 0) 
     (loop (- x 1) (cons input outputs)) 
     outputs))) 

> (five "yes") 
'("yes" "yes" "yes" "yes" "yes") 
0

要調用func2input六倍。它每次都會返回一個不同的值嗎?如果沒有,這個工作:

(define (func1 input) 
    (make-list 6 (func2 input))) 
0

這個問題有點混亂,你應該提供一個給定輸入的預期輸出的樣本。爲什麼空字符串在代碼中的處理方式不同?顯然遞歸值應該是x的值,而不是由func2返回的字符串的值。另外,你爲什麼複製字符串?似乎不必要。

假設名爲let只是用於保持迭代次數的軌道,這種解決方案似乎與你的意圖一致,因爲這將返回func2

(define (func1 input) 
    (let kloop ((x 6)) 
    (if (zero? x) 
     '() 
     (cons (func2 input) 
       (kloop (- x 1)))))) 
返回的所有字符串的6元素列表

但我們可以更聰明,並使用指定的let給予tail-recursive解決方案,這是更有效的:

(define (func1 input) 
    (let kloop ((x 6) 
       (acc '())) 
    (if (zero? x) 
     acc 
     (kloop (- x 1) 
       (cons (func2 input) 
        acc))))) 
+0

希望你的尾遞歸版本的返回是'(反向acc)'(與你的非尾遞歸解決方案一致)。 – GoZoner 2013-04-26 16:47:30

+0

@GoZoner yes和no:P這取決於回答你的問題:如果'func2'總是返回相同的值,那麼就沒有必要在年底扭轉。如果_does_返回不同的值,我同意你,在程序的尾遞歸版本末尾必須執行「反向」操作 – 2013-04-26 16:52:28