2014-02-19 104 views
1

我是Scheme的新手,我正在嘗試編寫一個程序,在每個步驟中都將一個符號添加到字符串中,並在最後返回字符串。 例如,使像一個字符串「TFTFT ......」在程序中向字符串變量添加符號

(define str "") 
(define foo 
     (lambda (x) 
      (
       (if(eqv? (car x) 3) (string-append str "T") (string-append str "F")) 
       (if(eqv? (car (cdr x)) 4) (string-append str "T") (string-append str "F")) 
       (if(eqv? (cdr (cdr x)) 5) (string-append str "T") (string-append str "F")) 
      ))) 

我想要的結果如下:

> (foo '(3 4 5)) 
"TTT" 
> (foo '(3 6 5)) 
"TFT" 

我知道,串追加一部分是不正確的。你能幫我一下嗎?

此外,當我嘗試運行該程序時出現錯誤: 應用程序:不是一個過程; 預期考慮到可以應用到參數的過程 : 參數...... 「T」: 「F」 「F」

+0

嗯,一件事'(cdr(cdr x))''會返回一個列表。你想''(car(cdr(cdr x)))'元素'5'。 – kbshimmyo

+0

是的,你是對的。我沒有仔細寫。我只是設計它來指出我的問題,即在遞歸過程中如何「將一些符號附加到一個字符串」。例如: : initila value:str =「」; next recurion:str =「0」; next recurion:str =「01」; next recurion:str =「011」; next recurion:str =「0110」; ...然後將此字符串作爲輸出。 –

回答

0

你說

製作像「TFTFT字符串.. 。「

這聽起來像你正在嘗試對任何長度的輸入序列執行此操作,而不僅僅是3個數字的列表。選擇T與F來追加到字符串的規則似乎是是列表元素是否比前面的列表元素大1。這一切是正確的嗎?

如果這就是你想要做的,你需要遞歸地做這件事,而不是試圖通過寫更多的if-clause來測試同一行中的所有元素。嘗試是這樣的:

;; foo-rec: list-of-ints string int -> string 
;; Returns a sequence of TFT... values indicating whether the corresponding nth position in 
;; the input list myseq contains the value (expected_val + n - 1). 
(define (foo-rec myseq mystr expected_val) 
    (cond 
    [(empty? myseq) mystr] 
    [(= (car myseq) expected_val) (foo-rec (cdr myseq) (string-append mystr "T") (add1 expected_val))] 
    [else (foo-rec (cdr myseq) (string-append mystr "F") (add1 expected_val))])) 

這給

> (foo-rec '(3 4 5) "" 3) 
"TTT" 
> (foo-rec '(3 6 5) "" 3) 
"TFT" 
> (foo-rec '(3) "" 3) 
"T" 
> (foo-rec empty "" 3) 
"" 
> (foo-rec '(3 4 5 7 7 8) "" 3) 
"TTTFTT" 

更多關於遞歸,看看在"How to Design Programs" (HTDP)(或its headier brother, SICP)。前者使得閱讀非常輕鬆。

+0

謝謝你的回答。 我想我不能將任何其他輸入作爲字符串傳遞給函數foo。 我可以用另一種方式做到嗎? –