Схема - функция, которая возвращает T / F, если каждый элемент списка представляет собой список из двух элементов. - PullRequest
0 голосов
/ 06 ноября 2011

Я пытаюсь написать функцию, которая возвращает T / F в отношении того, содержит ли список элементы, представляющие собой список (списки) с ровно двумя элементами, которые могут быть любыми выражениями. Я довольно новичок в Схеме и застрял на том, как определить, как это сделать. Я попробовал все от использования if, cond и lambda безуспешно. Кажется, у меня возникают проблемы с выяснением того, как сделать так, чтобы Схема проходила через весь список, и возвращалась ли она в конце T / F.

Некоторые примеры того, что я ищу:

(foobar? '((a 1)(b 2)))
#t
(foobar? '((foo 100)(bar 2 3)))
#f
(foobar? '((a 1) b (c 3)))
#f
(foobar? '((a 1) . 2))
#f

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2011

Моя схема немного ржавая, но кажется, что вам действительно нужно решить следующую проблему: дать что-то, вернуть его длину, если это список, в противном случае ноль. Получить длину списка легко: если пусто, ноль; остальное 1 + длина хвоста. Проверка того, является ли эта вещь списком, тоже должна быть возможной. Вызовите функцию, которая делает это LengthIfList.

Теперь ваше решение таково: true, если LengthOfList на голове равен 2, а функция, примененная к хвосту, возвращает true или список пуст, в противном случае - false.

0 голосов
/ 06 ноября 2011
  1. Напишите функцию has-two-elements?, которая определяет, имеет ли один список ровно два элемента.Это не должно быть слишком сложно.
  2. Напишите рекурсивную функцию all-have-two-elements?, которая определяет, являются ли все элементы списка списками ровно двух элементов.Необходимо рассмотреть два случая:

    • Базовый случай: в пустом списке нет элементов, которые не содержат ровно два элемента (поскольку в нем нет элементов).Итак, вы возвращаете #t.
    • Рекурсия: (has-two-elements? (car l)) и (all-have-two-elements? (cdr l)) должны быть оба истинными.

Это семь строк кода, если выправильно сделать отступ.

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