前提・実現したいこと
マス目状の盤上にある「島の数」を数えるプログラムを作成しています。
イメージは「https://www.techiedelight.com/count-the-number-of-islands/」のような感じです。このサイトでは斜めも同一の島としていますが、今回は上下左右のみを同一島と見なそうとしています)
再帰処理を行って正解を導き出す所までは出来たのですが、入力のデータが大規模になると「java.lang.StackOverflowError」が発生してしまいます。
調べた所「末尾再帰」の解決策に辿り着いたのですが、ほぼ全てint型のメソッドのreturn値を修正する内容が記載されており、void型の場合の解決策が分かりませんでした。
次のようなJavaのプログラムで「java.lang.StackOverflowError」が発生した場合、コードの中でハンドリングする際の記述方法についてご教授をお願いしたいです。
発生している問題・エラーメッセージ
Exception in thread "main" java.lang.StackOverflowError
該当のソースコード
package test; public class NumberOfIslands { public static void main(String[] args) { int colnum = 99; int rownum = 100; String row[] = new String[rownum]; for(int i=0; i<rownum; i++) { row[i]="1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"; } int island[][] = new int[rownum][colnum]; int shima_count =0; for(int i=0; i<rownum; i++){ for(int j=0; j<colnum; j++){ island[i][j] = Integer.parseInt(row[i].substring(2*j,2*j+1)); } } for(int i=0; i<rownum; i++){ for(int j=0; j<colnum; j++){ if(island[i][j]==1){ shima_count++; dxySearch(i,j,rownum,colnum,island); } } } System.out.println(shima_count); } public static void dxySearch(int is, int js, int rownum_s, int colnum_s, int[][] island_s){ if(is<0 || is>=rownum_s || js<0 || js>=colnum_s){ return; } if(island_s[is][js]!=1){ return; } island_s[is][js] = 0; dxySearch(is+1,js,rownum_s,colnum_s,island_s); dxySearch(is-1,js,rownum_s,colnum_s,island_s); dxySearch(is,js+1,rownum_s,colnum_s,island_s); dxySearch(is,js-1,rownum_s,colnum_s,island_s); } }
試したこと
「末尾再帰」について調べていたのですが、int型のメソッドのreturn値を修正する内容が記載されているものが多く、void型の場合の解決策が分かりませんでした。
補足情報(FW/ツールのバージョンなど)
OS : CentOS release 6.9 (Final)
Eclipse:Eclipse(OXYGEN)
Tomcat : v8.5
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/30 11:49
2019/08/30 13:02
2019/09/02 23:16