схема: вернуть lst, который содержит только первый элемент lst - PullRequest
1 голос
/ 02 ноября 2011

Вот вопрос:

Напишите функцию (first-n-elements lst n), которая возвращает список, содержащий только первые n элементы lst. Например, (first-n-elements '(1 2 3 4 5 6) 3) должно вернуть '(1 2 3). Ваша функция должна обрабатывать случай, когда n больше длины списка (в этом случае она возвращает весь список), а n равен 0 (должен возвращать '()).

Мой ответ:

(define (first-n-elements lst n)
  (cond((null? lst) '())    
       ((= n 0) lst))   
       ((> n 0) (cons (+ (car lst) 1) (first-n-elements) (cdr lst) (- n 1))))

Я знаю, что это неправильно, пожалуйста, помогите

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011

У вас есть натуральное число и список, и вам нужно выполнить рекурсию для обоих .См. Эту главу о рекурсии по двум сложным аргументам .Короткий ответ заключается в том, что вы должны рассмотреть все комбинации случаев для двух аргументов (по существу, декартово произведение).Конечно, вы можете обнаружить, что некоторые случаи могут быть объединены вместе, но если есть сомнения, начните с рассмотрения каждого из них в отдельности.

1 голос
/ 03 ноября 2011

В части вопроса сказано, что если n равно 0, то должно возвращаться '(). Но что делает ваша функция, когда n равен 0?

Также подумайте о рекурсивном случае здесь (> n 0). В настоящее время вы возвращаете cons из четырех аргументов:

  • (+ (car lst) 1)
  • (first-n-elements)
  • (cdr lst)
  • (- n 1)

Но cons принимает только два аргумента. У вас есть все части, но они не совсем правильно соединены. Чем вы хотите быть cons вместе?

Также: почему вы добавляете 1 к (car lst)? Это не сработает, если в lst есть что-то кроме цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...