私の問題は、再帰を使用すると通常はjava.lang.StackOverflowErrorが発生することです。 私の質問は - 再帰はなぜスタックオーバーフローを引き起こすのですか?それ以上のループは何ですか、スタックオーバーフローを避けるために再帰を使う良い方法はありますか?再帰によるjava.lang.StackOverflowError
これはproblem 107を解決するための試みである、それは彼らの例に適していますが、問題のそれを自己のためのスタック領域が不足します。
//-1 16 12 21 -1 -1 -1 16 -1 -1 17 20 -1 -1 12 -1 -1 28 -1 31 -1 21 17 28 -1 18 19 23 -1 20 -1 18 -1 -1 11 -1 -1 31 19 -1 -1 27 -1 -1 -1 23 11 27 -1
public class tries
{
public static int n=7,min=Integer.MAX_VALUE;
public static boolean[][] wasHere=new boolean[n][60000];
public static void main(String[] args)
{
int[] lines=new int[n]; Arrays.fill(lines, -1000); lines[0]=0;
int[][] networkMatrix=new int[n][n];
Scanner reader=new Scanner(System.in);
int sum=0;
for(int k=0; k<n; k++)
{
for(int r=0; r<n; r++)
{
networkMatrix[k][r]=reader.nextInt();
if(networkMatrix[k][r]!=-1) sum+=networkMatrix[k][r];
Arrays.fill(wasHere[k], false);
}
}
recursive(lines,networkMatrix,0,0);
System.out.println((sum/2)-min);
}
public static void recursive(int[] lines, int[][] networkMatrix, int row,int lastRow)
{
wasHere[row][value((int)use.sumArr(lines))]=true;
if(min<sum(lines)) return;
if(isAllNotMinus1000(lines)) min=sum(lines);
int[][] copyOfMatrix=new int[n][n];
int[] copyOfLines;
for(int i=0; i<n; i++)
{
copyOfLines=Arrays.copyOf(lines, lines.length);
for(int k=0; k<n; k++) copyOfMatrix[k]=Arrays.copyOf(networkMatrix[k], networkMatrix[k].length);
if(i!=0&©OfMatrix[i][row]!=0) copyOfLines[i]=copyOfMatrix[i][row];
copyOfMatrix[i][row]=0; copyOfMatrix[row][i]=0;
if(networkMatrix[row][i]==-1) continue;
if(wasHere[i][value((int)use.sumArr(copyOfLines))]) continue;
if(min<sum(copyOfLines)) continue;
recursive(copyOfLines,copyOfMatrix,i,row);
}
}
public static boolean isAllNotMinus1000(int[] lines)
{
for(int i=0; i<lines.length; i++) {if(lines[i]==-1000) return false;}
return true;
}
public static int value(int n)
{
if(n<0) return (60000+n);
return n;
}
public static int sum(int[] arr)
{
int sum=0;
for(int i=0; i<arr.length; i++)
{
if(arr[i]==-1000) continue;
sum+=arr[i];
}
return sum;
}
}
あなたの再帰が無限に呼び出されていませんか?あなたのコードを含めると助けになるかもしれません。 –
コードは非常に複雑で、小さな番号で動作するため、これは当てはまりません。しかし、コードを追加することは良い考えです。私はそれがトピックからあまりにも多くを漂わせないことを願っています。 – user2705335
Integer.MAX_VALUE行を持つ場合、各ループではレベルnの深いところで7回目の再帰を行っただけですが、(7 ^(n + 1)-1/6)-n-1回の繰り返しがあり、ほとんどの場合、彼らはベースケースを打つ。 forループは、Integer.MAX_VALUEのn倍の6倍の時間を追加します。 – Sylwester