foo(A, 1, 2, 3) выглядит как вызов функции а не определение. И ошибка возникает изза того что в конце этой строки нет ;void foo(int* A, int p, int q, int r); // объявление
/*
код в котором используется foo();
*/
void foo(int* A, int p, int q, int r) // определение
{
} nums[N]; с N=0;. Когда вы в него пишете, каждый раз рискуете поймать ошибку доступа к памяти.nums[i] = min;, должно быть наоборот))int min = nums[0];. min должен быть тоже float, иначе вы получите немного не то что ожидаете. unique_ptr - просто хранит динамический объект, когда будет уничтожен unique_ptr он автоматически освободит память с этим объектом.shared_ptr нужен когда есть несколько объектов работающих с одним экземпляром. shared_ptr указывающие на один и тот же объект сами считают свое количество и память будет очищена при уничтожении последнего.weak_ptr нужен если существует два объекта хранящих умные указатели друг на друга. Если их обоих сделать shared_ptr то программа не очистит память при попытке удалить один из них, так как уйдет в бесконечную рекурсию в попытке удалить их. Для решения есть weak_ptr он просто следит за своим объектом и не мешает его удалению, но может принять право владения если не будет других shared_ptr. FILE* res тебе в ней вообще не нужен. i так же можно отказаться.int recursion(int* x, int n)
{
if(n > 2) {
return recursion(x, n/2) * recursion(x + n/2, n - n/2);
} else if(n ==2) {
return x[0] * x[1];
} else {
return x[0];
}
}n - n/2 используется потому что происходит целочисленное деление и округление.