2014-05-06 212 views
0

我在方案中有一個函數,該函數多次調用另一個函數,並且每次該函數都會將另一個函數的返回值附加到結果值。 但最後我想得到一個結果,例如'(a b c),但是我得到的結果如此'((a) (b) (c))我該如何解決這個問題?我已經搜索,但我找不到好的解決方案。如何刪除方案中的括號?

我這樣的小代碼不是全部。

(append res (func x)) 
(append res (func y)) 
(append res (func z)) 

我這樣的代碼

(define (check a) 
'(1) 
) 

(define bos '()) 
(define (func a) 
(let loop1([a a] [res '()]) 
(cond 
[(eq? a '()) res] 
[else (let ([ x (check (car a))]) 
(loop1 (cdr a) (append res (list x))) 
)] 
) 
)) 
+1

請發佈一個最簡單的工作示例來演示您的問題。 – ikdc

+0

添加了最小的代碼。編輯了 –

+0

。我編輯我的代碼,我的檢查func有時返回一個元素有時返回一個列表,但我不想要parantheses。我怎樣才能做到這一點? –

回答

1

試試這個:

(define (func a) 
    (let loop1 ([a a] [res '()]) 
    (cond 
     [(eq? a '()) res] 
     [else 
     (let ([ x (check (car a))]) 
     (loop1 (cdr a) (append res x)))]))) 

請注意,我所做的唯一更改(除了改進格式),用x代替(list x)。這將訣竅!或者,但便攜性較差 - 你可以使用append*代替append

(append* res (list x)) 

作爲一個邊評論,你應該使用(null? a)進行檢測,如果該列表是空的。現在,如果我們測試使用的問題示例代碼的程序,我們會得到:

(func '(a b c)) 
=> '(1 1 1) 
+0

'append *'不包含在所有的Schemes中,反正你的用法相當於'(append res x)'。 – ikdc

+0

@IstvanChung夠公平的,它是固定的。 –

1

似乎不是

(loop1 (cdr a) (cdr b) c (append res (list x))) 

你想

(loop1 (cdr a) (cdr b) c (append res x)) 
0

基本上訣竅是使用cons而不是list。想象一下(list 1 2 3 4)這與(cons 1 (cons 2 (cons 3 (cons 4 '()))))相同。你看到每個部分是如何(cons this-iteration-element (recurse-further))這樣的:

(define (make-list n) 
    (if (zero? n) 
     '() 
     (cons n (make-list (sub1 n))))) 

(make-list 10) ; ==> (10 9 8 7 6 5 4 3 2 1) 

通常當你可以選擇的方向,你總是可以讓它尾遞歸與蓄能器:

(define (make-list n) 
    (let loop ((x 1) (acc '())) 
    (if (> x n) 
     acc 
     (loop (add1 x) (cons x acc))))) ; build up in reverse! 


(make-list 10) ; ==> (10 9 8 7 6 5 4 3 2 1) 

現在,這是一個通用的答案。適用於你的工作代碼:

(define (func a) 
    (let loop1 ([a a] [res '()]) 
    (cond 
     [(eq? a '()) (reverse res)] 
     [else 
     (let ([x (check (car a))]) 
     (loop1 (cdr a) (cons (car x) res)))]))) 

(func '(a b c)) ; ==> (1 1 1) 

append替換cons所以爲什麼不把car OG的結果列表的其餘部分。既然你想得到的結果是I reverse結果在基本情況下。 (不能從結果中真實地分辨出來,但是我猜是因爲你是append