Ваш код правильный, за исключением того, что он слишком многословен, чем мог бы быть.Подсказка: вам нужно беспокоиться только о двух случаях: lst
- это pair?
или нет.Это все.Другими словами, ваш код предполагает, что входные данные всегда являются списком, но его можно было бы упростить, чтобы принять что-либо и выполнить специальную рекурсивную вещь, когда это пара.
Что касается проблемы, с которой вы сталкиваетесь- Я предполагаю, что вы используете Racket, и, следовательно, вы работаете с нечетным случаем.Если это не так, тогда вы можете прекратить чтение здесь.
Дело в том, что в Racket сама функция будет компилироваться до выполнения привязки к map
, поэтому вызовы map
не являются рекурсивными., но вместо этого они просто звонят на встроенный map
.Позже map
(повторно) привязывается к результирующей функции, но рекурсивные вызовы уже были скомпилированы.Если вы введете одно и то же определение дважды, вы увидите, что оно снова начинает работать.Способ решить эту проблему - просто не работать в REPL, а вместо этого всегда записывать определения в файл, который начинается с некоторого #lang <something>
.