Functional programming 如何删除scheme中的括号?
scheme中有一个函数,这个函数多次调用另一个函数,每次这个函数都将另一个函数的返回值附加到结果值上。 但最后我想得到这样一个结果:Functional programming 如何删除scheme中的括号?,functional-programming,scheme,Functional Programming,Scheme,scheme中有一个函数,这个函数多次调用另一个函数,每次这个函数都将另一个函数的返回值附加到结果值上。 但最后我想得到这样一个结果:(abc),然而我得到这样一个结果:((a)(b)(c))我如何解决这个问题?我已经找过了,但找不到好的解决办法 我的小代码不是所有的 (append res (func x)) (append res (func y)) (append res (func z)) 我的代码是这样的 (define (check a ) '(1) ) (def
(abc)
,然而我得到这样一个结果:((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)))
)]
)
))
看来不是
(loop1 (cdr a) (cdr b) c (append res (list x)))
你想要
(loop1 (cdr a) (cdr b) c (append res x))
试试这个:
(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
替换(列表x)
。那就行了!或者,可移植性较差-您可以使用append*
而不是append
:
(append* res (list x))
作为旁注,您应该使用(null?a)
测试列表是否为空。现在,如果我们使用问题中的示例代码测试该过程,我们将得到:
(func '(a b c))
=> '(1 1 1)
基本上,诀窍是使用
cons
而不是list
。想象一下(列表1 2 3 4)
,它与(cons 1(cons 2)(cons 3(cons 4’(')))
相同。您是否看到每个部分是如何(与此迭代元素相反(进一步递归))
如下所示:
(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反向
基本情况下的结果。(从结果看不出来,但我猜是因为您使用了iseappend
)请发布一个简单的工作示例来演示您的问题。已编辑。我编辑我的代码,我的check func有时返回一个元素,有时返回一个列表,但我不想重复这些。我该怎么做呢?append*
并没有包含在所有的方案中,而且您的用法相当于(append res x)
。@IstvanChung很公平,它是固定的。