मेरी समस्या यह है कि मुझे आमतौर पर java.lang.StackOverflow त्रुटि मिलती है जब मैं रिकर्सन का उपयोग करता हूं। मेरा सवाल है - क्यों रिकर्सन स्टॉप ओवरफ्लो को लूप की तुलना में बहुत अधिक कारण बनाता है, और क्या स्टैक ओवरफ़्लो से बचने के लिए रिकर्सन का उपयोग करने का कोई अच्छा तरीका है?java.lang.StackOverflow रिकर्सन
यह 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 लाइनें होती हैं तो उसने केवल कुछ स्तरों में 7 के पहले रिकर्सन को लूप के लिए कुछ स्तर एन गहरा किया है, लेकिन इसमें (7^(एन + 1) -1/6) -एन-1 पुनरावृत्तियों को जाना है, सबसे अधिक अगर वे बेस केस मारते हैं। लूप के लिए प्रारंभ हालांकि 6 गुणा एन बार Integer.MAX_VALUE लाइनों को जोड़ देगा। – Sylwester