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