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