суббота, 4 августа 2012 г.

Задачка на логику.

Попробуйте решить задачку, не заходя под кат. Это интересно)



Предположим, что нужно сделать функцию от 4 аргументов (числа одинакового типа), возвращающую наименьшее из них. Без использования switch, не используя if/else более одного раза, не используя циклы и не создавая никаких новых переменных. Выбор языка не принципиален.



Мой вариант решения:

Суть состоит в рекурсивном вызове и строится вокруг единственного допустимого вызова конструкции if...else... . В условии проверяется, действительно ли аргумент first меньше остальных. Если да - возвращается результат (значение first). Если нет - возвращается результат рекурсивного вызова той же функции, но в ней аргумент first перемещается на четвертую позицию. Таким образом, мы псевдоциклом перемещаем наименьшие аргументы в конец списка аргументов до тех пор, пока не найдем минимальный, максимум за 4 итерации.


#include <iostream>
using namespace std;


template <class Type>
Type func(Type first, Type second, Type third, Type fourth)
{
if (first<second && first<third && first<fourth)
return first;
else
return func(second,third,fourth,first);
}

int main()
{
int fi(5),se(2),th(3),fo(4);

cout << "Result is "<< func(fi,se,th,fo) << endl;

system("PAUSE");
return 0;
}


Вариант с передачей функции сравнения (аналог перегрузки operator< в структурном стиле программирования).

#include <iostream>
using namespace std;


template<class Type>
Type func(Type first, Type second, Type third, Type fourth, bool (*TypeCmp)(Type,Type))
{
if ( TypeCmp(first,second) && TypeCmp(first,third) && TypeCmp(first,fourth) )
return first;
else
return func(second,third,fourth,first, TypeCmp);
}

bool IntCompare(int a, int b)
{
// Задаем функцию сравнения
// для int она бы была такой:
return a<b ? true : false;
}

int main()
{
int fi(5),se(2),th(3),fo(4);

cout << "Result is "<< func(fi,se,th,fo,IntCompare) << endl;


system("PAUSE");
return 0;
}

Комментариев нет:

Отправить комментарий