在SCHEME中的递归方法中仅应用一次调用

在SCHEME中的递归方法中仅应用一次调用,scheme,Scheme,我有我写的这个方法 (define (lev n L) ;(set! L(apply append L)) (cond ((null? L) '()) ((eq? n (car (car L))) (car L)) (else (lev n (cdr L))))) 我要应用“集合!”在递归之前只执行一次,并使用它完成。我想不出怎么做。试试这个: (define (lev n L) (let loop ((L (apply append L)))

我有我写的这个方法

(define (lev n L)
  ;(set! L(apply append L))
  (cond ((null? L) '())
        ((eq? n (car (car L))) (car L))
        (else (lev n (cdr L)))))
我要应用“集合!”在递归之前只执行一次,并使用它完成。我想不出怎么做。

试试这个:

(define (lev n L)
  (let loop ((L (apply append L)))
    (cond ((null? L) '())
          ((eq? n (car (car L))) (car L))
          (else (loop (cdr L))))))

在这里,我们使用a来定义
lev
(在本例中,它被称为
loop
),在调用它之前,我们将
append
应用于输入列表,并将其分配给一个新变量,也称为
L
。在这种情况下,不必使用
set,在惯用方案中,我们倾向于避免变异操作。

这是伟大的奥斯卡·洛佩兹:)因此我得到了这个错误,因为过程#[composite procedure 15 loop]是用两个参数调用的;它需要1个论证,我正在做(lev'bl),其中L是((a1)(b2)(c3))((d4)(e5)(f6)),我已经找到了另一种方法,但我想知道为什么我会犯这个错误,我不知道understand@Crowlands这是我的错误,当我们调用
循环
时,只需要一个参数(与
lev
相同的
n
,因为它在迭代过程中不会改变。)现在已修复:)请格式化您的代码。您的目标是什么?你试过什么?你所尝试的与你所期望的有什么不同?