0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
|||||||||||
1 | |||||||||||
Рекурсивная функция с возможностью заблокировать ввод некоторых параметров18.10.2018, 17:35. Показов 2426. Ответов 21
Здравствуйте. Нужно что-то типа этого сделать:
Я не понимаю, но она у меня почему-то накапливает результат и при повторном вызове бывает, что удваивает ответ... Тут нужно исправить три основных минуса: 1) она почему-то накапливает предыдущие результаты при повторных вызовах. Я так понимаю дело в том, что _result стала глобальной, потому что я из-за рекурсивного вызова сделал что-то типа замыкания??? Как это исправить? Предложите разные варианты, но с сохранением рекурсии. При первом вызове и при повторном: 2) Умирает ядро в Anaconda, если вызовов где-то от 1 до 3000 с шагом 1. Если от 1 до 2969 с шагом 1 — выскакивает ошибка. 3) Нужно заблокировать для программиста вызов функции со своими значениями параметров _now и _result. Или вовсе не использовать эти параметры, если возможно. Сейчас же можно самому вводить эти параметры и это ничем не ограничено: Для решения проблемы №3 я пока что придумал вот такой изврат:
0
|
18.10.2018, 17:35 | |
Ответы с готовыми решениями:
21
Рекурсивная функция у меня другая но только не рекурсивная Как заблокировать соц. сети по на некоторых ПК Рекурсивная и не рекурсивная функция вычисления НОД СКД с возможностью выбора некоторых строк Единократный ввод символа, запрет на ввод некоторых символов |
24 / 19 / 6
Регистрация: 10.11.2016
Сообщений: 51
|
||||||
19.10.2018, 03:14 | 2 | |||||
Наверно как-то так:
1
|
0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
|
21.10.2018, 12:42 [ТС] | 3 |
0
|
1291 / 908 / 479
Регистрация: 05.12.2013
Сообщений: 3,073
|
|
21.10.2018, 12:53 | 4 |
Какой-то у вас jupiter неправильный, сколько памяти есть?
0
|
24 / 19 / 6
Регистрация: 10.11.2016
Сообщений: 51
|
|
21.10.2018, 13:07 | 5 |
Тут несколько вариантов:
1. Поставьте нормальный Python (все летает меньше секунды) 2. Перепишите на циклы (если уж такой эстет) 3. Обновите среду в которой выполняете код Если не помогли эти три пункта: 3. Купите новый компьютер - я тестил 10 000 итераций, на совсем "скромном" железе (2гига, проц Atom 1.8гц) и на Rasppery Pi - все летает, может у вас еще скромнее.
0
|
0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
|
21.10.2018, 13:12 [ТС] | 6 |
Так вы в своём примере только 400 показали. Попробуйте вбить, например 10000 или хотя бы 3000. Слабый ноут, 4Гб ОЗУ. Но я думаю, что это вполне должно бы хватать, чтобы запомнить каких-то 10000 чисел и стек программы. Это могут делать компьютеры двадцатилетней давности, а с 4Гб ОЗУ и подавно. Что-то не так работает, как нужно. Код следует переписывать или настройки не те. Юпитер стандартный, ничего не перенастраивал, всё со стандартной Анаконды. Есть 4Гб оперативной памяти.
У меня ноут i3 шестое поколение, 4Гб ОЗУ и видео Radeon M330. Всё обновлено. Windows 10 LTSC (2018 с длительным сроком поддержки). Стоит стандартная Anaconda, без каких-либо дополнительных настроек.
0
|
928 / 690 / 269
Регистрация: 10.12.2016
Сообщений: 1,696
|
||||||
21.10.2018, 13:36 | 7 | |||||
есть обертка для рекурсии
https://habr.com/post/158385/
1
|
1291 / 908 / 479
Регистрация: 05.12.2013
Сообщений: 3,073
|
|
21.10.2018, 13:36 | 8 |
0
|
24 / 19 / 6
Регистрация: 10.11.2016
Сообщений: 51
|
||||||
21.10.2018, 13:37 | 9 | |||||
Каюсь, моя черепашка осилила:
0
|
0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
|||||||||||
21.10.2018, 14:30 [ТС] | 10 | ||||||||||
Я уже потерялся полностью. То есть на 4Гб оперативной памяти нельзя сделать то, что я хочу? Пробовал на чистом питоне, без анаконды, в IDLE. 5230 (в среднем) и потом Stack overflow ((( Добавлено через 8 минут Я не могу понять как подстроить это под код:
Я понял, что эта обертка просто не годиться для данной функции, не универсальна. Получается, что нужно саму функцию переписывать, а это уже огромный минус обертки... То есть без циклов конкретно данную задачу в рекурсии нельзя выполнить, так как всегда будет переполнение стека... А эти обертки они рекурсию превращают по сути в тот же цикл, причем работают не всегда и требуют переписывания функции, потому что там получится, что мы к списку добавляем функцию...
0
|
928 / 690 / 269
Регистрация: 10.12.2016
Сообщений: 1,696
|
||||||
21.10.2018, 14:43 | 11 | |||||
судя по описанию нужно добавить call в рекурсию, но глубоко я не вникал
0
|
0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
||||||
21.10.2018, 14:59 [ТС] | 12 | |||||
Это работает, если мы возвращаем функцию, но если мы конкатенируем, то не сработает.
Вот так не будет работать:
0
|
928 / 690 / 269
Регистрация: 10.12.2016
Сообщений: 1,696
|
|||||||||||
21.10.2018, 15:36 | 13 | ||||||||||
в таком случае конечно нет
типа так надо
или так
0
|
0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
|
21.10.2018, 15:37 [ТС] | 14 |
Вы сами попробуйте свой код запустить. Если дважды вызывать функцию, то она копит результаты, наверное из-за того, что ls стал глобальным, а не локальный...
0
|
0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
|||||||||||
21.10.2018, 15:51 [ТС] | 16 | ||||||||||
Я так сделал, так вроде работает хоть на миллионе:
Добавлено через 1 минуту Конечно теперь у вас работает, потому что вы исправили ошибку. Я говорил про то сообщение, которые вы отослали ранее. Потом вы его отредактировали и добавили рабочий код )) Добавлено через 6 минут Вот что я получил в конечном итоге. Если это как-то можно оптимизировать — предложите вариантов (ну кроме как переписать на циклы). Я пока ухожу, но потом сам посмотрю что да как. Видно я что-то лишнего совсем тут наделал, но работает ))
0
|
928 / 690 / 269
Регистрация: 10.12.2016
Сообщений: 1,696
|
|||||||||||
21.10.2018, 15:52 | 17 | ||||||||||
накопление данных в данном случае идет через изменение параметра, зря вы выдумываете
простая трассировка
0
|
21.10.2018, 18:12 | 18 | |||||
Рекурсия зло, если применять ее не по делу. В вашей задаче это именно так.
Простой while c yield создаст генератор на бесконечное число вызовов, который будет расходовать мизерный размер ОЗУ и тем более стека. Можно, конечно, и генератор засунуть в рекурсию:
Скажите вашему преподавателю, что в python нет оптимизации хвостовой рекурсии (Гвидо посчитал, что без этого вполне можно жить - то есть сразу писать итеративный код), поэтому нет никакого смысла использовать рекурсию нигде, кроме обхода древовидных структур.
1
|
0 / 0 / 0
Регистрация: 18.10.2018
Сообщений: 9
|
|
21.10.2018, 23:38 [ТС] | 19 |
Garry Galler,
У меня нет преподавателя. Мне 24 и я изучаю всё это самостоятельно, для себя, а не для оценки. Хочу сам разобраться как и что работает. Рекурсию я просто люблю, так как еще когда-то давно решал много мелких задачек на LISP, и просто влюбился в рекурсию. Думал тут это будет тоже работать хорошо и быстро, а оказалось всё сложнее.
0
|
22.10.2018, 00:06 | 20 |
Нет. Все будет очень медленно работать. Рекурсия - жуткий тормоз для программы.
Возможно, в ЛИСПЕ это не так, но это значит, что там есть оптимизация ХР, а это, в свою очередь, значит, что хвостовые рекурсивные вызовы просто транслируются в итеративные компилятором.
0
|
22.10.2018, 00:06 | |
22.10.2018, 00:06 | |
Помогаю со студенческими работами здесь
20
Генератор договоров docx c возможностью редактирования некоторых частей и переносом блоков Ввод всех параметров и валидация вводимых параметров Заблокировать ввод в игре Обновление некоторых параметров в контроллере Функция с переменным числом параметров находящая максимальный элемент в списке параметров Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |