java.lang.StackOverflowError en raison de la récursivité

Mon problème est que j'ai l'habitude de les obtenir un java.lang.StackOverflowError lorsque j'utilise la récursivité.
Ma question est, pourquoi ne récursivité cause stackoverflow autant plus que les boucles ne, et est-il un bon moyen d'utiliser la récursivité pour éviter un débordement de pile?

C'est une tentative de résoudre problème 107, il fonctionne bien pour leur exemple, mais à court d'espace de pile pour le problème lui-même.

//-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&&copyOfMatrix[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;
}
}
Êtes-vous sûr que votre récurrences ne font pas appel à eux à l'infini? Il pourrait être utile d'inclure votre code.
le code est très compliqué, parce que cela fonctionne pour un petit nombre, je suis certaine que ce n'est pas le cas. En ajoutant le code est une bonne idée, peu importe, si. J'espère juste que ça ne serait pas de dérive trop de hors sujet.
Lorsque vous avez Entier.MAX_VALUE lignes, il a seulement fait la première de la récursivité de 7 dans chaque boucle un certain niveau n de profondeur, mais il a (7^(n+1)-1/6)-n-1 itérations pour aller, plus si les frapper de la base de cas. La route pour les boucles d'ajouter 6 fois n fois Entier.MAX_VALUE lignes.

OriginalL'auteur user2705335 | 2013-08-21