2015-10-14 4 views
0

Я пытаюсь стать более знакомым с рекурсией на Схеме. Я искал банк вопросов и видел множество «встроенных» функций для поиска повторяющихся записей в списке схем, но я пытаюсь создать свой собственный. Я еще не узнал о «лямбда». Моя забота - когда я вызываю функцию рекурсии, элемент автомобиля будет обновлен. Я хочу сохранить одно и то же, но каждый раз передавайте новый cdr, поэтому исходный элемент автомобиля можно сравнить с каждым последующим элементом в списке. Я хочу вернуть #t, если есть совпадение, и #f, если нет совпадения, или cdr пуст (базовый регистр). Любая помощь/совет будут очень признательны.Поиск дублирующих элементов в списке схем

(define (findDuplicates list) 
    (if (null? list) 
     #f 
     (if (null? (cdr list)) 
      #f 
      (if (= (car list) (getCarOfCdr list)) 
       #t 
       (findDuplicates (cdr list)) //trying to use recursion 
      ) 
     ) 
    ) 
) 


(define (getCarOfCdr list)   //Helper function 
    (car (cdr list)) 
) 

ответ

1

Вы должны использовать, по крайней мере, один встроенный в процедуру, чтобы сделать вещи проще: member (который является стандартным). Некоторые общие рекомендации:

  • Вы не должны вызывать параметр list, который сталкивается со встроенной функцией с тем же именем.
  • Не гнездо if s нравится, используйте вместо этого cond.
  • Нам нужны только два базовых блока для этой проблемы, а не три, как в вашем коде.
  • getCarOfCdr не нужно: она может быть заменена вызовом cadr и, кроме того, что не будет работать: вы должны проверить каждый элемент против весь остальной список - вот почему вы должны использовать member.

Принимая во внимание все приведенные выше рекомендации во внимание, здесь предложено мое решение:

(define (findDuplicates lst) 
    (cond ((null? lst) #f) 
     ((member (car lst) (cdr lst)) #t) 
     (else (findDuplicates (cdr lst))))) 

При использовании member не удовлетворяет требованиям, то это легко осуществить, и проще, чем findDuplicates; вы должны попытаться написать свою собственную версию, просто для удовольствия.

Смежные вопросы