2010-05-02 4 views
0

написать функцию схемы, которая удаляет первое появление верхнего уровня заданного элемента из списка элементов. например, данный перечень (а б) пункт б, список результатов (а в)Функция схемы для удаления первого элемента

плз помочь мне

+0

Это домашнее задание? Если это так, отметьте его как таковой. –

ответ

0

Есть те функции автомобиля и корд, которые позволяют Вам взять части списка. Функция append позволяет вам объединить два списка в один. Я думаю, они могут пригодиться. Также проверьте функцию cons и убедитесь, что вы понимаете, что такое список на самом деле, и что он должен делать с парами.

Вы можете действовать следующим образом. Возьмите свой список, вырежьте первый элемент и проверьте, что это. Если это тот, который нужно удалить, отбросьте его. Если это не тот элемент, который нужно удалить, обработайте остальную часть списка, а затем добавьте этот элемент в начале.

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

Тривиальная оставшаяся задача по внедрению perl2scheme остается в качестве упражнения для читателя.

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 работает только на числах. Что еще более важно, полный, рекурсивный ответ на хвост, вероятно, не является правильным ответом на вопрос о домашнем задании. –

+0

Это PltScheme. И почему хвостик-рекурсивный ответ - не правильный ответ на вопрос о домашнем задании? – demas

+0

Я думаю, что Натан говорил, что полный ответ не помогает человеку узнать или понять знания - он просто дает ему решение. – Egon

0

(определить (удалить, первого элемент списка элементов распределения) (cond
((null? list) accum) (еще (cond ((= (список автомобилей)) (недостаток аккумулятора (список cdr))) (еще (элемент remove-first-originence (cdr list)) (0) )) ) )

(удаление-первое вхождение «(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 является первым из тех, что есть.