如何删除方案中的括号?

时间:2014-05-06 22:16:32

标签: functional-programming scheme

我在方案中有一个函数,这个函数多次调用另一个函数,并且每次该函数将另一个函数的返回值附加到结果值。 但最后我希望得到'(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)))
)]
)
))

3 个答案:

答案 0 :(得分:1)

似乎不是

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

你想要

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

答案 1 :(得分: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)))])))

请注意,我所做的唯一更改(除了改进格式设置)是将(list x)替换为x。那就行了!或者,但不太便携 - 您可以使用append*代替append

(append* res (list x))

作为旁注,如果列表为空,则应使用(null? a)进行测试。现在,如果我们使用问题中的示例代码测试过程,我们将获得:

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

答案 2 :(得分: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