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))
。我希望这能解决您的问题,如果答案对您有帮助,请不要忘记接受。