[英]How do I break out of this recursive call?
我是遞歸的新手,我仍在學習它,所以如果它不好,請容忍我糟糕的邏輯。 我有這個函數,它有 5 個參數 a、b、c、x、y。 所以我本質上想要做的是從這些變量中的一個中取出一個元素並將其添加到另一個中以最終得到 x , y 。 我想自己嘗試一下,我幾乎已經完成了,只是我想問一下,一旦我得到“是”的答案,我是否可以擺脫這種遞歸調用。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String in = sc.nextLine();
int[] input = new int[10];
for(int i=0; i < 10; i=i+2) {
input[i] = Integer.parseInt(String.valueOf(in.charAt(i)));
}
int A = input[0];
int B = input[2];
int C = input[4];
int X = input[6];
int Y = input[8];
persistent(A,B,C,X,Y);
}
private static void persistent(int a, int b, int c, int x, int y) {
if(a == 0 || b == 0 || c == 0) {
if((a == x && b == y) && (b == x && a == y)) {
System.out.println("YES");
}
else if((b == x && c == y) || (c == x && b == y)) {
System.out.println("YES");
}
else if((a == x && c == y) && (c == x && a == y)) {
System.out.println("YES");
}
else {
return;
}
}
persistent(a-1,b+1,c,x,y);
persistent(a-1,b,c+1,x,y);
persistent(a+1,b-1,c,x,y);
persistent(a,b-1,c+1,x,y);
persistent(a+1,b,c-1,x,y);
persistent(a,b+1,c-1,x,y);
}
你的代碼永遠不會。
遞歸算法幾乎都歸結為完全相同的風格:
首先,檢查是否達到了某些邊緣情況(通常是最簡單的情況)。 在這種情況下,立即返回 - 不要遞歸。 通過同義反復,如果答案如此簡單,您可以直接給出它而無需遞歸,這定義了“邊緣情況”/“簡單情況”。 必須至少有一種這樣的情況,否則遞歸算法將無法工作。
否則,請提供你的答案,並為您喜歡盡可能多的遞歸調用隨意雇佣,但這些電話的每一個最后一位必須是簡單的,通過的想法,它是嚴格更接近於簡單的情況下,在1提到的定義。
所有狀態都通過參數傳達。 通常有一個私有的輔助方法來完成實際工作,它有一堆額外的參數,而公共 API 是一個單行調用輔助函數,為這些額外的參數提供初始值。 只有當你沒有這種狀態時,你才能省略這個狀態。
你的代碼沒有這樣做。 有一個簡單的情況,即如果 a 或 b 或 c 為 0,但您的 6 次遞歸調用並沒有明顯地趨向於簡單。
修復並不明顯。 您的算法無法按書面方式工作,並且如果不經過大量重新思考就無法修復。
希望以上內容對您有所幫助:您的遞歸調用需要以某種方式變得更簡單,保證。 現在不能保證:是的,每次調用都將 3 個數字之一移近邊緣情況(為 0),但沒有明確的流程:如果我使用3/4/5
作為參數調用您的代碼,那么它與recurisve電話2/5/5
, 2/4/6
,等等。 第一次調用 ( 2/5/5
) 並不能保證更接近邊緣情況,因為作為其調用堆棧的一部分,它將再次執行3/4/5
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.