Ошибка при попытке вычислить (3*3)^2 с помощью рекурсивной задачи (Fork and Join) в Java
Я должен использовать 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)));
}
}
Однако когда я запускаю его, я получаю эту ошибку: ht tps:https://stackru.com/images/38f35900a15215446977a3ca2d4fe26fd1fcf758.png
Что я делаю не так?
Обратите внимание, что я новичок в Recursivetask на Java.
1 ответ
Ваш код вызывает 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
, поэтому звонки никогда не прекращаются.