Ошибка при попытке вычислить (3 * 3) ^ 2 с помощью рекурсивной задачи (форк и соединение) в Java - PullRequest
1 голос
/ 02 ноября 2019

Я должен использовать Java Recursive Task (Fork and Join), чтобы вычислить что-то вроде этого: (3 * 3) ^ 2.

У меня есть этот код, который должен работать:

public class ForkJoin1 extends RecursiveTask<Long> {
    int num;
    public ForkJoin1 (int num) {
        this.num = num;
    }
    @Override
    protected Long compute() {
        if(num == 0) return Long.valueOf(1);
        ForkJoin1 fj1 = new ForkJoin1(num*num);
        ForkJoin1 fj2 = new ForkJoin1((int) Math.pow(num, 2));
        fj1.fork();
        return fj1.compute() + fj2.join();
    }
    public static void main (String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        System.out.println("Result:  " + pool.invoke(new ForkJoin1(3)));
    }    
}

Однако, когда я запускаю его, я получаю эту ошибку: enter image description here

Что я делаю не так?

Обратите внимание, что я новичок в Recursivetask на Java.

1 Ответ

1 голос
/ 02 ноября 2019

Ваш код вызывает compute с num = 3,
, поэтому вы создаете новый объект и вызываете compute с num = 9 (3 * 3),
, поэтому вы создаете новый объект и вызываете compute с num = 81 (9 * 9),
для создания нового объекта и вызова compute с помощью num = 6561 (81 * 81),
для создания нового объекта и вызова compute для num = 43046721 (6561 * 6561),
, чтобы создать новый объект ивызов compute с num = -501334399 (43046721 * 43046721),
...

Упс, переполнение чисел . Ну, в любом случае это продолжается, с num, имеющим в начале следующие значения:

3
9
81
6561
43046721
-501334399
2038349057
-1970898431
120648705
1995565057
-1876701183
-1454923775
1989099521
2099150849
977076225
1954152449
-386662399
-773324799
-1546649599
1201668097
-1891631103
511705089
1023410177
2046820353
-201326591
-402653183
-805306367
-1610612735
1073741825
-2147483647
1
1
1
1
1
...

Как видите, num никогда не становится 0, поэтому вызовы никогда не прекращаются.

...