4 / 4 / 6
Регистрация: 10.04.2013
Сообщений: 45
|
||||||
1 | ||||||
Рекурсия, IF, новичок10.04.2013, 15:03. Показов 2444. Ответов 32
Метки нет (Все метки)
check(x) - проверяет, простое ли число x nums(n l x) - рекурсивная функция, составляющая список l простых чисел до указанного n, начиная проверку с x Почему (nums 30 (list) 1) не работает? P.S.: по учебе пришлось столкнуться с этим языком. Преподом предложена среда LispWorks. Ужасная кривая штука. Может попутно посоветуете ide?
0
|
10.04.2013, 15:03 | |
Ответы с готовыми решениями:
32
Новичок в питоне, но не новичок в программирование Новичок. Новичок... новичок |
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|
10.04.2013, 15:35 | 2 |
0
|
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
10.04.2013, 15:41 | 3 |
Стандартном является Emacs + SLIME, в частности, в виде Lisp in the Box. Всё можно поставить на винде. Я пользуюсь vim + slimv.
Если бы вы проверяли каждую функцию, REPL очень ругался бы уже на check. Во-первых, в Лиспе истина и ложь суть t и nil соответственно. Вы, конечно, можете использовать символы true и false, но тогда заквотить их: 'true, 'false. Хотя в данном случае без надобности. Во-вторых, как только вы написали (true), (false), Лисп пытается вызвать функции true и false с нулевыми аргументами. Это дефолтное обхождение со списком: первый элемент считается именем функции, остальное - аргументами. В-третьих, ваша функция почти для всех x хочет проверить, будет ли число составным. Идиоматический способ построения списков с нуля (то есть с nil) - добавлять элементы в голову с помощью push, а потом деструктивно разворачивать с помощью nreverse. append в цикле дорого обходится. Подробнее - вечером. Если интересно, я тоже недавно с простыми числами баловался: https://www.cyberforum.ru/post4310051.html
0
|
4 / 4 / 6
Регистрация: 10.04.2013
Сообщений: 45
|
|
10.04.2013, 15:59 [ТС] | 4 |
При выполнении ошибка
0
|
Модератор
|
|||||||||||
10.04.2013, 16:17 | 5 | ||||||||||
Много ошибок... Поэтому и не работает. А вот так:
Добавлено через 7 минут Исходная функция nums ошибочна:
1
|
4 / 4 / 6
Регистрация: 10.04.2013
Сообщений: 45
|
|
10.04.2013, 16:43 [ТС] | 6 |
0
|
4 / 4 / 6
Регистрация: 10.04.2013
Сообщений: 45
|
|
10.04.2013, 17:48 [ТС] | 8 |
Ну не одну, закрывающую тоже =)
А вообще спасибо =) уже разобрался. просто недопонимал синтаксис языка.
0
|
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
|
|
10.04.2013, 18:59 | 9 |
0
|
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||||||
10.04.2013, 23:28 | 10 | |||||
Добавлено через 34 минуты mcmishok, вот аналог кода Catstail'а, но 100% pure ANSI Common Lisp:
Ещё на эту тему: https://www.cyberforum.ru/post4342165.html
1
|
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
|
||||||
11.04.2013, 00:34 | 11 | |||||
как вариант:
2
|
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
11.04.2013, 00:38 | 12 |
w - тайный аргумент. Если пользователь случайно передаст туда список, то-то удивится, обнаружив его вверх ногами.
0
|
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
|
||||||
11.04.2013, 00:53 | 13 | |||||
1
|
helter
|
||||||||||
11.04.2013, 02:10
#14
|
||||||||||
Не по теме:
В Питоне даже декларируется такой подход: всё решается договорённостью. Если в документации написано, что нужно давать функции два параметра, а ты три дал, то вся ответственность ложится на тебя. Кому как, а меня Коммон Лисп интересует не тем, что в стандарт включили опциональные аргументы функций, а тем, что это язык, который подстраивается под нужды задачи. Грэм пишет: если есть паттерн, имеет смысл создать утилиту. labels - немного многословнее. Но хуже, наверно, то, что решение получается не в одно действие, а в два: сначала вспомогательная функция, потом само решение. Я познакомился с Лиспом (и с функциональным программированием) через Scheme. И очень мне нравился там named let. Это как раз синтаксис, передающий рекурсию. Вот я попробовал написать его аналог:
Задача опять стала в одно действие. Однако всё равно пришлось ввести в рассмотрение новое имя. Собственно, так и задумано, ведь прототип - именованный let. Их же может быть несколько, да ещё они могут и скакать друг между другом (императивные языки со своими убогими циклами нервно курят в сторонке). Но в нашей-то задаче это вроде ни к чему? Наверно потому, что нам и не нужна мощность рекурсии в полном объёме, а достаточно обойтись одним стандартным средством. do:
2
|
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
|
|||||||||||
11.04.2013, 08:40 | 15 | ||||||||||
возможно Вы правы - циклы против рекурсивных вызовов:
1
|
4 / 4 / 6
Регистрация: 10.04.2013
Сообщений: 45
|
|
11.04.2013, 09:19 [ТС] | 16 |
Позволяет удалять текст, выводимый интерпретатором. Периодически вылетает, из-за чего всегда копирую код в блокнот.
0
|
Модератор
|
||||||
11.04.2013, 10:53 | 17 | |||||
До кучи (без рекурсии и в одно действие):
1
|
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||||||
11.04.2013, 12:04 | 18 | |||||
Да нет. Цикл - частный случай рекурсии. И хвостовая рекурсия - по сути итерация. Оператор do со всеми своими изменениями счётчиков замечательно записывается через ламбду, то есть он вполне функциональный.
Сравните что я написал выше через nlet (рекурсия в собственном соку) и через do. По сути разница только в том, что do - анонимный. Если мы не хотим использовать именованную рекурсивную функцию (потому что задача слишком простая), напрашивается do, потому что он именно для этого и служит: организация сравнительно несложной итерации. И поэтому код с do получился таким кратким и по делу. Не по теме:
0
|
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
|
||||||
11.04.2013, 13:34 | 19 | |||||
0
|
4 / 4 / 6
Регистрация: 10.04.2013
Сообщений: 45
|
|
11.04.2013, 13:35 [ТС] | 20 |
я бы с удовольствием делал без рекурсии, но использование рекурсии было оговорено заданием =)
Я смотрю, вы тут увлеклись
0
|
11.04.2013, 13:35 | |
11.04.2013, 13:35 | |
Помогаю со студенческими работами здесь
20
Новичок C++ C Новичок Новичок Новичок в Qt Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |