2013-02-19 7 views
0

Вот моя тестовая программа деления и покорения, но это дает мне ошибку. Я направляюсь в правильном направлении?Simple Divide and Conquer Пример

public class getSum { 
    static int sum = 0; 
    public static void main(String[] args) { 
      int[] numbers = {2,2,2,2,2,2,2,2}; 
      int amount = 0; 
      amount = sumArray(0,numbers.length,numbers); 
      System.out.print(amount); 
    } 

    public static int sumArray(int first, int last, int[] A){ 
     int index = last - first; 
     if(index == 1){ 
      return sum; 
     }else if(index <= 4 && index > 1){ 
      for(int i = first; first < last; i++){ 
       sum += A[i]; 
      } 
      return sum; 
     } 
     return (sumArray(first, last/2, A) + sumArray(last/2, A.length, A)); 
    } 
} 

Здесь ошибка Исключение в потоке «главный» java.lang.StackOverflowError в getSum.sumArray (getSum.java:16)

Ищу простой пример принимает массив из 16 и разбивая его на базовый футляр 4. У меня возникли проблемы с полным пониманием того, как выплюнуть массив, а затем разделить его снова. затем объедините все расщепления в конце.

+0

любой конкретный язык? –

+0

C++, java или что-то в этом роде. Мне просто нужно понимание – shinjuo

ответ

1

Вы можете использовать рекурсию для разделения и завоевания. Вы продолжаете рекурсировать на меньших массивах, пока не найдете совпадение, а затем поднимитесь по дереву рекуперации.

Например: найти ли число в массиве с помощью рекурсивной функции ISIN (число х, массив)

Boolean isIn(Number x, Array a) { 

    n = a.size 
    if n==1 then return a[0]==x 
    else 
     return isIn(x, a[0:n/2]) or isIn(x,a[n/2:n]) 
} 

Вы можете увидеть, как эта проблема делится на две меньшие проблемы, и т.д. , пока он не достигнет условия остановки 'n == 1', тогда он начнет возвращать результаты по дереву вызовов. Это псевдокод, вам нужно будет адаптировать концепцию к используемому вами языку программирования

1

Неполадка, полностью понимающая, как наплевать на массив, а затем разделить его снова.

Использование Recursion позволяет сделать это.

+0

Вот что я не знаю, как это сделать. – shinjuo

+0

Чтобы прочитать мою книгу и некоторые интернет-примеры. – shinjuo

+0

@Bhusha_Firake Я добавил тестовый разрыв и победил выше. Это похоже, что я на правильном пути? – shinjuo

Смежные вопросы