2010-05-02 70 views
0

编写一个方案功能,用于从项目列表中删除给定项目 的第一个顶级事件。 如定列表(A B C)B项,结果列表(C)删除第一个元素的方案功能

plz帮助我

+0

这是功课吗?如果是这样,请标记为这样。 – 2010-05-02 11:45:46

回答

0

还有那些功能车和CDR,使您可以采取部分列表。函数追加允许您将两个列表合并为一个。我认为他们可能会来得方便。同时检查一下cons函数,并确保你理解列表的实际内容,以及它与pair有什么关系。

举例如下。拿出你的名单,把第一个元素删除并检查它是什么。如果是被删除的那个,就丢弃它。如果它不是要删除的元素,则处理列表的其余部分,然后在开始处追加该元素。

-1
 
perl2scheme -s \ 
'use strict; sub remove_first { \ 
grep { $_ ne $_[0] || $first++ } @{ $_[1] }; } \ 
print join(",",remove_first("b", ("a","b","c"));' 

执行perl2scheme的一小部分余下的任务留给读者作为excercize。

3

想想你想完成什么。

你有一个东西的列表,你正试图删除某个元素。

example: trying to remove b 
(a a a a b a a b a ...) 
anything before first b should be kept and anything after it also.. 
so we have to spit out from our function: 
a a a a + a a b a ... 

如果我们将这一数字减少到递归操作:

at any point looking through the list you can: 

1. inspect element at front of the list and give it out to the result 
    and recursively inspect the rest of the list 
2. stop if you found your element and 
    give out the rest of the list as you've accomplished your task 
0

像这样的东西(如果它是一门功课):

(define (remove-first-occurence some-list find-symbol accum) 
    (cond 
    [(empty? some-list) accum] 
    [else (cond 
      [(= (first some-list) find-symbol) (cons accum (rest some-list))] 
      [else (remove-first-occurence (rest some-list) find-symbol (cons (first some-list) accum))] 
      )])) 

(remove-first-occurence '(1 2 3 4 3) 3 empty) 
+0

这是clojure吗?它不是Scheme - 'empty?'不是Scheme函数,Scheme的'='只能用于数字。更重要的是,一个完整的,尾递归的答案可能不是一个作业问题的正确答案。 – 2010-05-02 13:19:52

+0

这是一个PltScheme。为什么尾递归的答案不是一个作业问题的正确答案? – demas 2010-05-02 13:50:05

+0

我认为Nathan说完整答案并不能帮助人学习或掌握知识 - 它只是给他/她解决方案。 – Egon 2010-05-02 17:40:19

0

(定义(删除-一线发生列表元素accum) (cond
((null?list)accum) (else (cond ((=(轿厢列表)组件)(利弊ACCUM(CDR列表))) (否则(删除先occurence(CDR列表)组件(利弊(汽车列表)ACCUM))) ) ) ) )

(除去先occurence“(1 2 3)2”())

1

不知道你想要什么,而是先用一个指标简单地启动它,这是相当多的,你怎么也得“思考'与计划,首先开始'如果它是第一个元素?',答案当然是它应该是列表的其余部分。然后'好的,如果它不是第一个',那么答案是'它应该首先考虑到对其余部分应用相同过程的结果',这就是所有信息方案在这方面的需求,并且很多情况下真。

(define (slice-out lst k) 
     (if (<= k 0) (cdr lst) ; if we want to remove the first (0) element, surely the result is simply the tail of the list? 
      (cons (car lst) ; if it's higher than 0, we just cons the first element... 
       (slice-out (cdr lst) (- k 1))))) ; to the result of the same method applied to the tail but with one lower k. 

> (slice-out '(a b c d e) 2) 
===>(a b d e) 

如果列表对索引来说太短,此函数将返回一个错误。

但是,如果你想通过一些平等另一个目的是切出来,这个例子就足够了,我们现在不再切出来的,我们达到0,但如果它等同于搜索例如:

(define (slice-out-by-equality lst search) 
    (if (equal? (car lst) search) (cdr lst) 
     (cons (car lst) 
      (slice-out-by-equality (cdr lst) search)))) 

> (slice-out-by-equality '(a b c d e) 'c) 
===> (a b d e) 

使用相同的原理,但是如果该项不是找到,则返回错误。

的一点是,方案具有平等的比较多的口味,所以,我们真正想要的是这样的:

(define (make-slice-out comparison) 
    (lambda (lst search) 
    (let loop ((lst lst)) 
     (cond 
     ((null? lst) '()) 
     ((comparison (car lst) search) (cdr lst)) 
     (else (cons (car lst) (loop (cdr lst)))))))) 

这个例子说明了什么计划是一回事,不知道你是否正在与它知道,但是我们在这里使用了一个闭包,这个函数实际上将任何二进制比较函数作为参数,然后求值到你想要的函数,它也被消毒,如果没有找到,它不会再犯错误,它只是简单地返回它返回旧列表,因为如果它到达列表的末尾,没有删除任何东西,它只是将它再次提交给()。

> ((make-slice-out =) '(1 2 3 6 3) 6) 
===> (1 2 3 3); we just made an anonymous function here. 

但是记住我们最初的功能,我们现在可以定义它只是这样,供应谓语时“平等的吗?”我们的新功能其实取值为我们的老功能(与它现在消毒的重要资产):

(define slice-out-by-equality (make-slice-out equal?)) 

而且,还有更多的二进制比较,这个怎么样更奇特的例子:我们

(define slice-out-less-than (make-slice-out <)) 

做函数这个方式,切片指出,严格大于我们的搜索词少的第一个元素,所以这会作用:

> (slice-out-less-than '(573 284 238 174 92 47) 100) 
====> (573 284 238 174 47) 

即使47也小于100,92是第一那些是。

相关问题