Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Стоит ли совершать повторяющиеся действия через цикл, или может есть более правильные способы?

С Новым Хреновым! Гуру (4997), на голосовании 14 часов назад
Скажем, есть функция, которая отрисовывает в окне горизонтальные линии.

Каждая линия на своей высоте. Одну нарисовали, вторая чуть выше, третья еще выше и т. д.

Конечно, если таких линий будет штук 500, то писать отдельную функцию для каждой из них неразумно. Лучше запускать одну функцию через цикл с изменяемыми аргументами.
Обычно я так и делаю, но правильно ли это?
Голосование за лучший ответ
Андрей Высший разум (460605) 1 месяц назад
В императивных языках мне с ходу вспомнилось 5 вариантов организации повторов:
  1. Цикл. Наиболее очевидный и наиболее часто используемый способ. Наилучший выбор для твоей задачи.
  2. Рекурсия. Имеет смысл в тех случаях, когда записать алгоритм рекурсией оказывается удобнее, чем циклом.
  3. Функция, применяющая пользовательскую функцию к каждому элементу набора данных: map, filter, reduce, foreach ("суповой набор" из 4 типовых функций, выполняющих разные виды обработки; в разных языках их названия различаются).
  4. Оператор goto - в тех языках, где он есть. Организовывать цикл оператором перехода - лютый говнокод. Но никто не запрещает это делать.
  5. Метапрограммирование - в тех языках, в которых язык шаблонов является Тьюринг-полным: например, в C++. Вот тут ты можешь написать шаблон, который в скомпилированном коде развернётся в последовательность вызовов функций без циклов. Но это, чаще всего, работа гиков и для гиков. В промышленном программировании такое не приветствуется.

В функциональных языках пунктов 1 и 4 нет. Пункт 5 под вопросом.
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (263685) 1 месяц назад
В данном случае цикл — нормальное решение. Но есть способы оптимизации: вынос инвариантов за пределы цикла, предварительные вычисления, упрощение (умножение вместо возведения в степень), мемоизация, отказ от вложенных функций. А также — функции высшего порядка (map()), генераторы, графические библы для вывода готовых фигур..
Николай Веселуха Высший разум (368748) 1 месяц назад
 #include <iostream> 
#include <sstream>
#include <string>
using namespace std;
string repeat(const string& s, size_t n, const char delim = '\0') {
stringstream ss;
while (n--) ss << s << delim;
return ss.str();
}
int main() {
auto s = repeat(string(50, '_'), 25, '\n');
cout << s;
}
Похожие вопросы