List 如何对列表中的元素使用递归?

List 如何对列表中的元素使用递归?,list,recursion,lisp,scheme,compare,List,Recursion,Lisp,Scheme,Compare,我试图在列表中使用递归,我需要遍历所有元素。这是我的密码: (define compare (lambda (ls pred?) (if (null? list) #f (pred? (list-ref ls (- (length ls) 2)) (list-ref ls (- (length ls) 1)))))) 但它只适用于最后两个元素。结果应该是这样的: (compare '(1 2 3 4 5) <) -> #t (compar

我试图在列表中使用递归,我需要遍历所有元素。这是我的密码:

(define compare
  (lambda (ls pred?)
    (if (null? list)
        #f
        (pred? (list-ref ls (- (length ls) 2)) (list-ref ls (- (length ls) 1))))))
但它只适用于最后两个元素。结果应该是这样的:

(compare '(1 2 3 4 5) <) -> #t
(compare '(1 2 8 4 5) <) -> #f
(比较(12345)#
(比较’(1 2 8 4 5)#f
你知道我应该怎么做吗?

你没有在代码中的任何地方使用递归。事实上,它有错误,我认为你没有彻底测试它。例如:

  • if
    条件应为
    (null?ls)
  • 在Scheme中遍历列表时,使用
    list ref
    不是一个好办法,因为通常您希望使用递归、
    car
    cdr
  • 同样,递归调用在哪里?
    compare
    应该在某个时候调用
我相信这是您想要的,它不是递归的,但它是实现过程的最简单方法:

(define (compare ls pred?)
  (apply pred? ls))
因为这看起来像是家庭作业,所以我只能给你一些提示,让你从头开始解决问题,而不必使用
apply

(define (compare ls pred?)
  (if <???>                    ; special case: if the list is empty
      <???>                    ; then return true
      (let loop ((prev <???>)  ; general case, take 1st element
                 (ls   <???>)) ; and take the rest of the list
        (cond (<???>           ; again: if the list is empty
               <???>)          ; then return true
              (<???>           ; if pred? is false for `prev` and current element
               <???>)          ; then return false
              (else            ; otherwise advance the recursion
               (loop <???> <???>)))))) ; pass the new `prev` and the rest of the list
(定义(比较ls pred?)
(如果;特殊情况:如果列表为空
;然后返回true
(let循环((上);一般情况下,取第一个元素
(ls));并获取列表的其余部分
(cond;;再次:如果列表为空
);然后返回true
(;如果'prev'和当前元素的pred?为false
);然后返回false
(else;否则推进递归
(循环‘‘‘‘‘)’;传递新的“prev”和列表的其余部分
请注意,我使用了一个名为
let
的函数来实现递归,因此这里的递归过程是
loop
:您可以看到
loop
loop
中被调用。或者,您可以定义一个helper过程。考虑到列表为initiall的特殊情况,我必须这样做我是空的


递归在一般情况下是这样工作的:需要两个参数,
prev
将上一个元素存储在列表中,
ls
存储列表的其余部分。在遍历的每个点上,我们检查上一个元素和当前元素的谓词是否为false-如果是这样,则返回false。如果否t、 我们用一个新的
prev
(当前元素)和列表的其余部分继续递归。我们继续这样做,直到列表为空,然后才返回true。

我知道apply,但我不能使用它。问题在于:(我有点傻。这里应该是什么:(;如果pred?对于
prev
和当前元素为false,那么这里:(loop‘‘‘‘‘)’);传递新的
prev
和列表的其余部分。在???->(循环(汽车列表)(cdr列表))或什么的else@Ats:第二部分是正确的。对于第一部分:这是程序的核心,思考一下:什么会使整个程序返回错误?这样如何:与
pred?
相比,前一个元素和当前元素的计算结果为false。我已经尝试了一整天,但没有任何效果。我试过:(pre?(car-lis)prev),(pre?prev(car-lis))。我不知道我应该在那里写些什么。@Ats你差点就明白了。。。好的,我将帮助您了解最后的细节-如果
pred?
为false,我们将返回false。这就是我的意思:
(不是(pred?prev(car ls))
。我希望这能解决您的问题,如果答案对您有帮助,请不要忘记接受。