Форум программистов, компьютерный форум, киберфорум
turbanoff
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Цитата №1 из книги Стива Макконнелла "Совершенный код"

Запись от turbanoff размещена 06.09.2012 в 21:46
Показов 41056 Комментарии 15
Метки java

Навеяно недавно появившимися говнокодом записями в блогах: раз, два

Не используйте рекурсию для факториалов и чисел Фибоначчи.
Одна из проблем с учебниками по вычислительной технике в том, что они предлагают глупые примеры рекурсии. Типичными примерами являются вычисление факториала или последовательности Фибоначчи. Рекурсия - мощный инструмент, и очень глупо использовать ее в этих двух случаях.
Java
1
2
3
4
5
6
7
int Factorial(int number){
   if (number <= 1) {
      return 1;
   } else {
      return number * Factorial(number-1);
   }
}
Не считая медленно выполнения и непредсказуемого использования памяти рекурсивный вариант функции трудней для понимания, чем итеративный вариант:
Java
1
2
3
4
5
6
7
int Factorial(int number){
   int intermmediateResult = 1;
   for (int factor = 2; factor <= number; factor++){
      intermmediateResult = intermmediateResult * factor;
   }
   return intermmediateResult;
}
Из этого примера можно усвоить три урока. Первый: учебники по ВычТеху не оказывают миру услугу своими примерами рекурсии. Второй, и более важный: рекурсия - гораздо более мощный инструмент, чем можно предположить из сбивающих с толку примеров расчета факториала и чисел Фибоначчи. Третий - самый важный: вы должны рассмотреть альтернативные варианты перед использованием рекурсии. Иногда один способ работает лучше, иногда - другой. Но прежде чем выбрать какой-то один, надо рассмотреть оба.
Метки java
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 15
Комментарии
  1. Старый комментарий
    Аватар для alex_x_x
    Из этого примера можно усвоить три урока. Первый: учебники по ВычТеху не оказывают миру услугу своими примерами рекурсии.
    это не совсем так
    рекурсия естественное средство для функциональных языков, и такие примеры более чем естественны
    другое дело, что при императивном подходе есть более удачные способы решения таких задач
    Запись от alex_x_x размещена 09.09.2012 в 03:17 alex_x_x вне форума
  2. Старый комментарий
    Аватар для Evg
    turbanoff, а какой бы пример ты привёл, если бы сам написал учебник?
    Запись от Evg размещена 09.09.2012 в 20:40 Evg вне форума
  3. Старый комментарий
    Аватар для turbanoff
    Цитата Сообщение от Evg
    turbanoff, а какой бы пример ты привёл, если бы сам написал учебник?
    Примеры которые приводит Макконнелл: поиск пути по лабиринту и быстрая сортировка.

    Насчет меня - не знаю, никогда бы не стал писать учебник.
    Запись от turbanoff размещена 10.09.2012 в 11:18 turbanoff вне форума
  4. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от turbanoff
    Примеры которые приводит Макконнелл: поиск пути по лабиринту и быстрая сортировка.
    А тебе не кажется, что это слишком сложные примеры для человека, который в принципе не понимает о том, что такое рекурсия? А факториал - он по своей природе рекурсивен и к тому же очень прост для понимания.

    Цитата Сообщение от turbanoff
    Насчет меня - не знаю, никогда бы не стал писать учебник.
    Речь шла о том, что если ты считаешь, что кто-то что-то делает неправильно, то для порядку надо хотя бы написать о том, как, по твоему, делать правильно
    Запись от Evg размещена 10.09.2012 в 16:02 Evg вне форума
  5. Старый комментарий
    Аватар для turbanoff
    Цитата Сообщение от Evg
    А тебе не кажется, что это слишком сложные примеры для человека, который в принципе не понимает о том, что такое рекурсия? А факториал - он по своей природе рекурсивен и к тому же очень прост для понимания.
    Изучать рекурсию ради изучения, как мне кажется, бессмысленно. Если человек не может применить рекурсию, то смысла от того, что он ее знает или понимает - никакого.
    Исходя из примеров факториала/Фибоначчи, происходит так: студент решает простенькую задачу-лабораторку, успешно сдает, и благополучно забывает про навязанный(притянутый) пример рекурсии. После чего он считает её чем-то ненужным, так как примеры явно притянуты. Более того, он не может определить, когда же нужна рекурсия для решения действительно настоящей задачи.

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

    PS. Как вы заметили, это статья не моя, это цитата из книги, я лишь поддерживаю мнение автора.
    Запись от turbanoff размещена 10.09.2012 в 20:46 turbanoff вне форума
  6. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от turbanoff
    Исходя из примеров факториала/Фибоначчи, происходит так: студент решает простенькую задачу-лабораторку, успешно сдает, и благополучно забывает про навязанный(притянутый) пример рекурсии
    Рассуждения несколько притянуты за уши, т.к. ты явно хочешь, чтобы было всё и сразу, при этом предполагая, что если что-то лично тебе удалось легко понять, то оно будет легко понято и всеми остальными. Если не хочешь факториал или фибоначчи, то можно взять функцию Аккермана. Её описание так же рекурсивно, при этом без рекурсии с нею геморроиться. При этом остаётся широкое раздолье для оптимизации алгоритма продвинутыми читателями

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

    Цитата Сообщение от turbanoff
    Поэтому я уверено, что рекурсию следует давать студентам/ученикам гораздо позже чем это делают большинство учебников. Как раз когда они уже готовы для приведенных примеров.
    Когда я учился в школе, то к производным и интегралам относился как к чему-то, что надо вычислить, но не понятно зачем и как. Когда в институте стали рассказывать про проивзодные, то процесс реального понимания пошёл очень хорошо и очень быстро. Потому что в голове за 2-3 года успела устаканиться некая техническая база и благодаря этому всё воспринималось значительно легче. Если бы производные и интегралы в школе не преподавали, то с нуля эти знания нифига бы не прижились

    Цитата Сообщение от turbanoff
    PS. Как вы заметили, это статья не моя, это цитата из книги, я лишь поддерживаю мнение автора.
    Заметил. Только название книги - "совершенное программирование". А ты пытаешься натянуть цитату на процесс обучения. Что как бэ не одно и то же
    Запись от Evg размещена 11.09.2012 в 00:34 Evg вне форума
  7. Старый комментарий
    Аватар для Evg
    Кстати, с твоей стороны не было никакой реакции на пост alex_x_x. Но, возможно, ты не в курсе, что такое функциональное программирование
    Запись от Evg размещена 11.09.2012 в 00:37 Evg вне форума
  8. Старый комментарий
    Аватар для turbanoff
    Цитата Сообщение от Evg
    Если не хочешь факториал или фибоначчи, то можно взять функцию Аккермана. Её описание так же рекурсивно, при этом без рекурсии с нею геморроиться. При этом остаётся широкое раздолье для оптимизации алгоритма продвинутыми читателями
    Да, вот это было бы замечательно.
    Цитата Сообщение от Evg
    Заметил. Только название книги - "совершенное программирование"
    Перепутали название А книга хороша - советую к прочтению.
    Цитата Сообщение от Evg
    А ты пытаешься натянуть цитату на процесс обучения. Что как бэ не одно и то же
    Я не пытаюсь - просто высказал свое мнение. Почему вы вообще решили, что я пытаюсь писать учебник/менять систему обучения и т.п.?
    Запись от turbanoff размещена 11.09.2012 в 07:57 turbanoff вне форума
  9. Старый комментарий
    Аватар для turbanoff
    _ _
    Запись от turbanoff размещена 11.09.2012 в 08:04 turbanoff вне форума
  10. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от turbanoff
    Перепутали название
    Каюсь, перепутал. Но суть от этого не меняется. Книга учит профессиональному подходу к программированию. И именно в контексте этого подхода имеет смысл цитата "Не используйте рекурсию для факториалов и чисел Фибоначчи". Ты же пытаешься применить эту цитату к совершенно другой сфере - к процессу обучения. Другими словами, выворачиваешь наизнанку и сильно искажаешь смысл того, что хотел донести автор книги до читателя

    Цитата Сообщение от turbanoff
    Я не пытаюсь - просто высказал свое мнение.
    Вопрос исключительно в терминологии, а смысл тот же самый. Твоё мнение выражается в том, что учебники написаны неверно. И в качестве аргумента в свою пользу ты неправомерно используешь цитату

    Цитата Сообщение от turbanoff
    Почему вы вообще решили, что я пытаюсь писать учебник/менять систему обучения и т.п.?
    Я никогда этого не говорил. Я сказал "а какой бы пример ты привёл, если бы сам написал учебник?" Ты эту мысль не понял, а потому ниже я её расшифровал: "речь шла о том, что если ты считаешь, что кто-то что-то делает неправильно, то для порядку надо хотя бы написать о том, как, по твоему, делать правильно". И пока дело с мёртвой точки не сдвинулось. Ты, условно говоря, раскритиковал современные учебники, но при этом ничего конструктивного не предложил взамен. А это сильно напоминает анекдот:

    К сожалению, все те, кто знает, как управлять страной, уже работают таксистами или парикмахерами
    Запись от Evg размещена 11.09.2012 в 10:20 Evg вне форума
  11. Старый комментарий
    Аватар для turbanoff
    Цитата Сообщение от Evg
    Ты же пытаешься применить эту цитату к совершенно другой сфере - к процессу обучения. Другими словами, выворачиваешь наизнанку и сильно искажаешь смысл того, что хотел донести автор книги до читателя
    Наверно стоит указать более явно - ВСЯ статья является цитатой из книги (кроме самого первого предложения, разумеется).
    Запись от turbanoff размещена 11.09.2012 в 10:34 turbanoff вне форума
  12. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от turbanoff
    Наверно стоит указать более явно - ВСЯ статья является цитатой из книги (кроме самого первого предложения, разумеется).
    Понятно. Тогда это более правильно называется не "цитата", а "выдержка". А то так выглядит, как будто цитата из книги - это выделенное жирным, а остальное - твой собственный текст.

    В любом случае с написанным я не согласен в контексте процесса обучения. При условии, что написанное не выдрано из поясняющего контекста
    Запись от Evg размещена 11.09.2012 в 12:54 Evg вне форума
  13. Старый комментарий
    да кстати именно это место с рекурсией я и прочитал когда заглянул в книжный магазин (а я туда заглядываю только с той целью, чтобы узнать какую книгу мне потом скачать, ну или просто посидеть)

    в общем, многие примеры можно красивее сделать и без рекурсии, а рекурсия это очень часто выпендрёж школьника)))
    расход памяти в случае рекурсии тоже может быть недетским, особенно если заключить всяческие локальные переменные и их создание внутри этого метода, не создавая их до этого или не очищая память от этих переменных внутри этого метода(ну это в случае если можно памятью управлять).
    Запись от za5 размещена 18.09.2012 в 11:20 za5 вне форума
  14. Старый комментарий
    Аватар для Bringoff
    Что бы ни говорили,а рекурсия —, это зло. Чаще всего. Поэтому лучше ее избегать, когда это возможно. Хотя,я тут на с# писал «игрулю» угадай число, так там рекурсивно проверялось совпадение. Но это не то, что надо оптимизировать в скорости: 10 мс туда-сюда не повлияют на восприятие, а вот при вычислении факториала это будет ощутимое время.
    В общем, бежим от рекурсии далеко и дружно.
    Запись от Bringoff размещена 01.02.2013 в 21:25 Bringoff вне форума
  15. Старый комментарий
    Аватар для Bringoff
    Если что, это все мое имхо.
    Запись от Bringoff размещена 01.02.2013 в 21:25 Bringoff вне форума
 
Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru