Latest posts on Задача, понимающим рекурсию topichttps://python.su/forum/topic/33754/2017-10-31T17:13:11+02:00Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-31T17:13:11+02:00Isem185622<blockquote><em>Helseeret</em><br/>Для начала, как я понимаю, в каждой рекурсивной функции т.е каждый раз когда функция вызывает саму себя сохраняются переменные этой функции т.е используя рекурсию у нас на каждом вызове функции будут разные переменные, и выполняться будет она до базового случая, а как она дойдет до базового случая она будет идти в обратном порядке, используя значения верх лежащей функции (если рассматривать стек, как кувшин, в котором последней зашедшей предмет будет выходить первым) для вычисления низ лежайшей функции и так до тех пор пока не дойдет до самой первой вызванной функции. Так вот задача звучит так вывести рекурсивно числа от 1 до n. Суть в том, что понимаю как работает стек и рекурсия. Т.е вывести с n до 1 получается, а наоборот нет. Не понимаю как эту задачу выполнить, ведь при шаге рекурсии (n-1) наш стек заполняется от n до 1 значениями где 1 будет в самом верху стека, и только после этого выводить все элементы стека, когда рекурсия пойдет на спад, но если подключить print мы будем выводить числа с n до 1, а не с 1 до n. Нам надо как-то выводить числа стека только после того, как она достигнет базого случая и пойдет на спад. Как это сделать ? Кто может, объясните пожалуйста словами, а не просто кодом. Вот мой вариант с кодом от n до 1, a надо с 1 до n</blockquote><br/>Чтобы вывести N чисел по порядку, надо сначала вывести N-1 чисел и вывести N. Вот и мы и получили зависимость функции от самой себя. Ну а чтобы рекурсия не была бесконечна, надо проверить N на 1.<br/><br/><div class="code"><pre> <span class="k">def</span> <span class="nf">prn</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">prn</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="n">prn</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
</pre></div>
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-11T08:16:58+03:00Shaman184789<blockquote><em>py.user.next</em><br/>Ну ребёнок-то маленький тоже одни конфеты есть хочет. А уровень сахара в крови, анализы, больницы в шесть утра? Знает он, что всё это будет из-за конфет?</blockquote>Ребёнок в реальной жизни будет не только цифирки складывать, но и деревья с графами обходить, да ещё и с побочными эффектами.
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-11T08:09:00+03:00py.user.next184788<blockquote><em>Shaman</em><br/>Ну блин</blockquote>Ну ребёнок-то маленький тоже одни конфеты есть хочет. А уровень сахара в крови, анализы, больницы в шесть утра? Знает он, что всё это будет из-за конфет?
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-11T08:06:42+03:00Shaman184787<blockquote><em>py.user.next</em><br/>Он хочет разобраться, а ты ему предлагаешь школьный уровень.</blockquote>Тут вся тема - школьный уровень.
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-11T08:01:18+03:00Shaman184786Ну блин<br/><blockquote><em>Helseeret</em><br/>Нам надо как-то выводить числа стека только после того, как она достигнет базого случая и пойдет на спад. Как это сделать ?</blockquote>
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-11T00:40:23+03:00py.user.next184778<blockquote><em>Shaman</em><br/>Существуют вполне обыденные задачи</blockquote>Он хочет разобраться, а ты ему предлагаешь школьный уровень, который при реальной разработке вылезет. Школьные примерчики хороши для школы и школьных учителей информатики, коих мы тут видали уже.
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T15:33:02+03:00Shaman184755<blockquote><em>py.user.next</em><br/>При таком варианте она не будет оптимизирована и твой спуск выпадет с лимитом, когда туда подадут n = 100000. И ты его никак в цикл не превратишь, потому что написал всё вот таким макаром.</blockquote>Существуют вполне обыденные задачи, при решении которых мыслеблудие математиков только мешает.
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T15:26:36+03:00py.user.next184754<blockquote><em>Shaman</em><br/>Ключевые слова: “подъём” и “спуск”.</blockquote>При таком варианте она не будет оптимизирована и твой спуск выпадет с лимитом, когда туда подадут n = 100000. И ты его никак в цикл не превратишь, потому что написал всё вот таким макаром.
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T15:17:45+03:00Shaman184753<blockquote><em>Shaman</em><br/>Поменять местами вызов func с выводом.</blockquote>Ключевые слова: “подъём” и “спуск”.
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T15:15:27+03:00py.user.next184752<blockquote><em>Shaman</em><br/>Тут же всё POC!</blockquote><u>Хвостовая</u> - ключевое слово.<br/><a href="https://ru.wikipedia.org/wiki/%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F">wiki. хвостовая рекурсия</a>
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T15:08:14+03:00Shaman184751<blockquote><em>py.user.next</em><br/>сначала всё разматывается и кладётся в память</blockquote>Тут же всё POC!
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T15:02:46+03:00py.user.next184750<blockquote><em>Shaman</em><br/>Поменять местами вызов func с выводом.</blockquote>Выглядит просто, но не хвостовая, потому что сначала всё разматывается и кладётся в память. Рекурсивный вызов выполняется не последним в теле функции. Хотя в обычном питоне оно и не преобразуется в цикл, как в других языках.
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T14:44:28+03:00Shaman184748<blockquote><em>Helseeret</em><br/>Не понимаю как эту задачу выполнить</blockquote>Поменять местами вызов func с выводом.<br/><br/><div class="code"><pre>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">func</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
</pre></div>
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-10T04:20:25+03:00py.user.next184720<a href="http://python.su/forum/post/116342/">Определение рекурсии</a><br/><a href="http://python.su/forum/topic/29867/?page=1#post-162402">Разбор рекурсии</a><br/><a href="https://python.su/forum/post/176386/">Разъяснение про дополнительный аргумент</a><br/><a href="https://python.su/forum/post/226910/">Описание работы копий функции</a><br/><br/><div class="code"><pre>
<span class="o">>>></span> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">prn</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="o">...</span> <span class="k">if</span> <span class="n">n</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="o">...</span> <span class="k">print</span><span class="p">(</span><span class="n">prn</span><span class="p">)</span>
<span class="o">...</span> <span class="n">func</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">prn</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="o">...</span>
<span class="o">>>></span> <span class="n">func</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="mi">1</span>
<span class="mi">2</span>
<span class="mi">3</span>
<span class="mi">4</span>
<span class="mi">5</span>
<span class="mi">6</span>
<span class="mi">7</span>
<span class="mi">8</span>
<span class="mi">9</span>
<span class="mi">10</span>
<span class="o">>>></span>
</pre></div><br/>tags: recursion
Общий :: Python для экспертов :: Задача, понимающим рекурсию
2017-10-09T19:36:00+03:00Rodegast184711> Так это два параметра в функции , а с одним можно как-то сделать<br/><br/>У функций может быть более 1 параметра. Не вижу в этом никакой проблемы.<br/><br/>> и почему мы не описываем базовый случай<br/><br/>Я тебе сам принцип показал. Остальное уже сам доделывай.