Поиск повторяющихся элементов в списке схем с помощью рекурсии - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь создать функцию, которая проверяет список чисел на наличие дубликатов и возвращает либо #t, либо #f.Я могу использовать только автомобиль, CDR и условные, никаких минусов.Это то, что я имею до сих пор, но оно дает мне ошибку «машина: ожидается нарушение контракта: пара? Дано: #f»

(define (dups a)
    (if (null? a)
        #f
        (if (= (car a)(car(dups(cdr a))))
            #t
            (dups (cdr))
        )
    )
)

Я новичок и в схеме, и в рекурсии, любая помощь / советбудет принята с благодарностью.

1 Ответ

0 голосов
/ 07 октября 2018

Ваш второй if не имеет особого смысла.Я предполагаю, что вы хотели проверить, появляется ли (car a) где-то ниже по списку, но (car (dups (cdr a))) не дает вам этого.Кроме того, (car (dups ...)) является проблемой типа, поскольку dups будет возвращать логическое значение вместо списка, а car ожидает список (или фактически пару, из которой состоят списки).

То, что вам нужно, это вторая функция для вызова в тесте этой секунды, если.Эта функция берет элемент и список и ищет этот элемент в списке.Конечно, если вам разрешено, используйте find, в противном случае реализуйте какой-нибудь my-find - это довольно просто и похоже на вашу dups функцию.

...