Алгоритм суммирования «Разделяй и властвуй»

#c #sorting #array-algorithms

#c #сортировка #массив-алгоритмы

Вопрос:

я искал некоторые алгоритмы D amp; C и основал этот

 int sumArray(int anArray[], int size)
{
    //base case
    if (size == 0)
    {
        return 0;
    }
    else if (size == 1)
    {
        return anArray[0];
    }

    //divide and conquer
    int mid = size / 2;
    int rsize = size - mid;
    int lsum = sumArray(anArray, mid);
    int rsum = sumArray(anArray   mid, rsize);
    return lsum   rsum;
} 
  

но каждый раз, когда я запускаю код без базового варианта, он возвращает ошибку ошибки сегмента.
я пытаюсь понять, почему этот базовый вариант настолько важен, что даже при запуске с n> 1 он по-прежнему возвращает эту ошибку, кто-нибудь протянет руку помощи здесь?

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

1. Если вы никогда не вернетесь в качестве базового варианта, вы, очевидно, будете повторяться вечно… который заполнит стек фреймами стека и, следовательно, segfault.

Ответ №1:

Поскольку функция sumArray вызывает себя рекурсивно,

     int lsum = sumArray(anArray, mid);
    int rsum = sumArray(anArray   mid, rsize);
  

базовый вариант необходим независимо от размера массива. В противном случае Fnction никогда не сможет выйти из цикла вызова самого себя!
И помните, что это основано на том факте, что один из mid и rsize может быть нечетным или четным в обоих базовых случаях для size == 0 и size == 1 :

     if (size == 0)
    {
        return 0;
    }
    else if (size == 1)
    {
        return anArray[0];
    }

  

необходимы

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

1. о, да, конечно, я забыл о части рекурсии, спасибо.

2. @theguissan добро пожаловать. и спасибо, что задали вопрос. Также не обращайте слишком много внимания на голоса «нет»