По значению дает набор цифр :
int recursiveMinimum(vector<int>array)
{
static int min = INT_MAX, count = 0;
if (count < array.size())
{
if (array[count] <= min)
min = array[count];
count++;
recursiveMinimum(array);
}
else
return min;
}
По указателю дает правильный ответ:
int recursiveMinimum(vector<int>&array)
{
static int min = INT_MAX, count = 0;
if (count < array.size())
{
if (array[count] <= min)
min = array[count];
count++;
recursiveMinimum(array);
}
else
return min;
}
У вас отсутствует return в первой ветке if. Ваша функция ничего не возвращает ни из одного уровня рекурсии, кроме самого нижнего. Поведение не определено в обоих вариантах, т.е. ваше возвращенное на самый верх значение - это просто мусор.
А то, что этот мусор случайно совпадает с правильным ответом во втором варианте - известный феномен, заключающийся в том, что при отсутствующем return иногда получается так, что из наивно странслированного кода (без оптимизаций и т.п.) "как бы возвращается" последнее вычисленное значение (например, регистр eax для значения типа int на платформе x86), если оно не будет затерто другим кодом при выходе из функции.
При передаче по значению при выходе из функции будет вызываться деструктор array, который с большой долей вероятности затрет содержимое eax, в результате чего из функции будет "возвращен" совсем посторонний мусор. При передаче по ссылке при выходе из функции ничего не делается и последнее значение eax сохраняется в нетронутом виде. Из-за этого создается иллюзия того, что второй вариант "работает правильно".
Разумеется, любой чих в организации кода или в настройках компилятора будет убивать эту случайную "работоспособность" вашего второго варианта.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей