vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Вчера одна 15-летняя девушка, дочь моих хороших знакомых, с гордостью опубликовала в своём ЖЖ описание своих первых заработавших программ со школьных уроков по программированию.

Среди них была программа для подсчета суммы всех четных чисел меньших заданного.

Даже ежу (но не нашим школьным преподавателям информатики) понятно, что эта задача вообще-то решается по замкнутой формуле. Без всяких циклов. Гаусс, помнится, аналогичную задачу в третьем классе в уме решал, выведя указанную формулу самостоятельно. Современным школьникам, насколько я помню школьный курс алгебры, самостоятельно выводить формулу даже не надо. Надо только сообразить что эта задача решается по той формуле.

Соответственно, я запостил данной девушке коммент с подковыркой "Надеюсь эта программа не содержит циклов и скорость её не зависит от введенного числа?".

Совершенно неожиданно для меня отец и отчим этой девушки, взрослые люди, профессиональные программисты, один из которых имеет опыт руководства крупным проектом, а другой весьма уверенно растет в неплохого software architect в один голос стали высказываться на тему того, что я не по делу вмешиваюсь в учебный процесс, и вообще не рановато ли таким сложным вещам девочку учить (девочка на вид выглядит совершенно взрослой дамой, и на ролевых играх успешно играет весьма непростых взрослых персонажей, чья роль требует решения нетривиальных задач).

А ведь по хорошему счету, тот навык на который я намекнул в своей подковырке, существенно важнее, чем знание конкретного языка программирования, и даже императивного программирования вообще. И учить в школе надо именно ему, а не конкретике, используя конкретику только для иллюстрации применения метода.

Возможно, девушке никогда в жизни не придется писать программы. Но почти наверняка ей придется работать на компьютере с текстами, или с табличными данными. Нынче это даже для ведения личных финансов необходимо.

Поэтому понимание того, что привлечение знаний из соседней предметной области может превратить длинную и нудную работу (не важно выполняешь ты её руками и мышью, или у тебя программа по циклу бегает) в одномоментную операцию, в жизни пригодится всегда. Кстати, аналогия между длительной ручной работой, и программой считающей что-либо в лоб - тоже не бессмысленное знание.

Удивительно не то, что этого не понимают замученные учениками и методистами школьные учителя. Удивительно то, что родители, которые вообще-то сами эти принципы знают и умеют ими пользоваться, не считают что в 15 лет им пора учить. Или не считают что им стоит учить на примере школьных заданий.

Date: 2006-11-13 06:01 am (UTC)
From: [identity profile] silly_sad.livejournal.com
а помоему потом будет очень трудно изжить в себе Первое Впечатление о рекурсии как о чём-то ненужном и исключительно вредном, ресурсоёмком.

Date: 2006-11-13 10:48 pm (UTC)
From: [identity profile] zhuk-s.livejournal.com
Исходя из собственного опыта, рискну не согласиться. Когда третьим-четвертым примером приводится красивая фрактальная фигурка, это не забывается.

Date: 2006-11-13 10:51 pm (UTC)
From: [identity profile] zhuk-s.livejournal.com
Кстати, чем рекурсивное вычисление факториала принципиально хуже итерационного ?
Код меньше. Понятнее. Вычислительная сложность та же.
Большинство оптимизирующих компиляторов развернут его в инлайн-цикл, так что на затратах памяти тоже не скажется ;)
Хм ?

Date: 2006-11-14 06:10 am (UTC)
From: (Anonymous)
вот !
ключевое слово "большинство компиляторов".
учить программированию надо абстрактно от конкретных компиляторов. (ТЕМ БОЛЕЕ ТАКИХ !)
а сложность рекурсии "по памяти" здесь неоправдана - ничем не лучше "тупого рекурсивного построения ряда фибоначи".
понастоящему охрененный пример рекурсии это сортировка сложности n*log(n) операций
но он недоступен пониманию на первом занятии
поэтому вопрос о преподавании рекурсии для меня остаётся открытым

Date: 2006-11-14 09:55 am (UTC)
From: [identity profile] zhuk-s.livejournal.com
Если учить программировать абстрактно, то про стек можно вообще не говорить, посему рекурсивное вычиление факториала ничем не отличается от итерационного, кроме того, что оно проще и понятней.
Насчет того, в чем разница с рядом Фибоначчи, мне нужно объяснять, или сами догадаетесь ?

Date: 2006-11-14 10:14 am (UTC)
From: [identity profile] zhuk-s.livejournal.com
Для сортировки O(n*log(n)) рекурсия не обязательна. Наиболее часто встречающиеся сортировки такой оценки - пирамидальная (для внутренних данных) и слияниями и ее модификации (чаще для внешних) в клссическом изложении не рекурсивны.

Date: 2006-11-13 10:52 pm (UTC)
From: [identity profile] zhuk-s.livejournal.com
PS.
Вот за тупое рекурсивное построение ряда фиббоначи я бью ногами :)

Date: 2006-11-16 01:42 am (UTC)
From: [personal profile] laruldan
А не совсем тупое (которое сводиться к tail recursion)?
А если вспомнить, что тупое итерационное --- оно тоже тупое (O(n) вместо возможного O(log(n)) на возведении матрицы 2x2 в степень)?
А если вспомнить, что есть, вообще говоря, и формула, которое вычисляет его сразу (правда, IRL она не очень применима, по очевидным причинам, но тем не менее)?
В общем, правильно --- это давать таки тупое решение, объяснять, почему оно тупое, давать менее тупое, и далее по нарастающей ;-) Закончить можно как раз к концу урока, продемонстрировав заодно опасности чрезмерной оптимизации :-)
Если сразу дать нетупое --- нихера не поймут. Если не давать не тупое --- переоценят собственные познания.
PS вспоминая книги по программизму, в которых мне попадалось вычисление чисел фибоначи --- там ровно такая последовательность изложения там и была: тупое рекурсивное, "братцы, а что-ж так тормозит, соптимизируем-ка влоб"->рекурсивное с запоминанием, итерационное (в языках с обязательной tail recursion --- соответственно, вариант с ней, родимой). Впрочем, до O(log(n)) доходил мало кто (кажись, у Кнута и у Шеня, или меня склероз подводит?).

Date: 2006-11-16 01:47 pm (UTC)
From: [identity profile] zhuk-s.livejournal.com
tail recursion устраивает
то, что терационное тупое.. ну что ж.. пузырьковая сортировка тоже O(n^2), но тем не менее очень даже не тупая и применимая. А вот если кто-то будет сортировать полным перебором комбинаций...

Надо будет посмотреть, но по-моему тупое рекурсивное расссматривалось обычно только в разделе - как не надо делать и почему.

К сожалению, сейчас нет возможности перелистать Кнута, а Шень где-то файликом валялся, к сожалению не на винте, пойду пороюсь, может найду.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

May 2025

S M T W T F S
    1 2 3
4 56 7 8 9 10
11 12 131415 1617
1819202122 2324
252627 282930 31

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 1st, 2025 12:14 am
Powered by Dreamwidth Studios