@HonestHacker

Что не так в этой рекурсии?

есть массив. нужно найти рекурсивно произведения его множителей. путём деления пополам массива. но рекурсивные вызовы должны остановиться если кусок массива с которым работаем состоит из одного или двух элементов.

int recursion(int* X, int N, int i, FILE* res)
	{
		if (N - i == 2) 
			return X[i] * X[i+1];

		if (N - i == 1)
			return X[i];

			int N1 = N/2;
			int i2 = N - N1 + 1;

			return (recursion(X, N1, i, res)*recursion(X, N, i2, res));
	}


fprintf(res, "%d", recursion(X, N, i, res)); вот так вывожу ответ

X- массив N - изначально длина массива

проблема в том что визуалка говорит что у меня исключение под строкой int recursion...
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
Правильный вариант функции:
int mul(int * arr, int N, int shift = 0)
{
    switch (N)
    {
        case 1:
            return arr[shift];
        break;

        case 2:
            return (arr[shift] * arr[shift + 1]);
        break;

        default:
            int M = N / 2;
            return (mul(arr, M, shift) * mul(arr, N - M, shift + M));
    }
}

В вашей функции последние три строки выполняются всегда, вне зависимости от длины массива. Поэтому происходит выход за границы массива.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Что не так в этой рекурсии?

Она выглядит непонятно. Её можно переписать понятно так:
int mul(const int *x, int n)
{
    assert(n > 0);
    if (n == 1)
        return x[0];
    if (n == 2)
        return x[0] * x[1];
    return mul(x, n / 2) * mul(x + n / 2, n - n / 2);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы