Форум » C/C++ » Как в С++ напечатать числа от 1 до 100 без использования циклов? » Ответить

Как в С++ напечатать числа от 1 до 100 без использования циклов?

Сыроежка: Как в С++ напечатать числа от 0 до 100 без использования циклов? Этот вопрос я встретил на одном Западном форуме. Казалось бы вопрос не имеет никакой практической пользы, но тем не менее некоторые решения оказались очень остроумными и познавательными! Естественно, первое, что приходит на ум опытному программисту, это использование рекурсивного вызова функции. Ее можно написать различными способами. Я приведу код, который сам написал, как говорится, на первом порыве. Для простоты можно ограничить последовательность выводимых чисел от 1 до 10. [pre2]#include <iostream> void print( size_t n ) { if ( !n ) return; print( n - 1 ); std::cout << n << ' '; } int main() { print( 10 ); }[/pre2] Как видите, это довольно простой код, и такой или подобный может написать каждый опытный программист, особо не утруждаясь. Но самое интересное возникает после того, как вы предложите использовать рекурсивный вызов функции: а есть ли другие способы выполнить ту же самую задачу? И, вот, здесь уже лишь единицы могут придумать что-то оригинальное. Два таких решения я и хочу продемонстрировать ниже. Надеюсь, они вам понравятся. Первое - это использование класса со статическим членом-счетчиком. Этот счетчик и будет выводиться на экран конструктором класса. [pre2]#include <iostream> struct S { S() { std::cout << ++i << ' '; } ~S() { --i; } private: static size_t i; }; size_t S::i = 0; int main() { S s[10]; }[/pre2] Вот и весь код! Мы просто объявили массив из 10 элементов структуры S, а конструкторы каждого отдельного элемента массива выполнили всю необходимую работу. Казалось бы, что еще можно придумать? Но, оказывается, есть и третье не менее оригинальное и остроумное решение с использованием шаблонов. Попробуйте выполнить следующий код: [pre2]#include <iostream> template <size_t n = 10> struct S : public S<n-1> { S() { std::cout << n << ' '; } }; template <> struct S<0> {}; int main() { S s; }[/pre2] Не правда ли, блестящая идея? До такого с налету не додумаешься! Если у кого есть свои идеи, как можно реализовать эту простую задачу оригинальным способом, то выкладывайте свои идеи!

Ответов - 2

Сыроежка: А вот еще одно оригинальное решение поставленной задачи с помощью стандартного алгоритма. Хотя все стандартные алгоритмы, имеющие дело с последовательностями, используют в своем теле циклы, тем не менее вызов стандартного алгоритма формально с точки зрения условия задачи является корректным. То есть формально в коде отсутствует явно предложение цикла. Вот это решение. [pre2]#include <iostream> #include <functional> #include <algorithm> class value: public std::unary_function<void, size_t> { public: value(): count( 0 ) {} size_t operator ()() const { return ( ++count ); } private: mutable size_t count; }; int main() { std::generate_n( std::ostream_iterator<size_t>( std::cout, " " ), 10, value() ); std::cout << std::endl; }[/pre2]

Сыроежка: Идею с рекурсивным инстанцированием шаблона класса можно перенести на шаблонную функцию. Тогда соответствующий код будет выглядеть следующим образом: [pre2]#include <iostream> template <size_t n> void f() { f<n-1>(); std::cout << n << ' '; } template <> void f<0>() {} int main() { f<10>(); std::cout << std::endl; }[/pre2]



полная версия страницы