나는 다음과 같은 문제에 근무하고 this question in stackoverflow에 응답으로 제공되는 재귀 솔루션을 다음 후 모든 결과 배열을 점점 방법을 이해하지 않았다 요소를 교대에서 가능한 모든 정렬 된 배열을 생성 문제는 다음과 같습니다. 두 개의 정렬 된 배열 A와 B가있는 경우 첫 번째 요소가 A에서 가져온 다음 B에서 가져온 다음 A부터 배열 순서대로 배열이 고갈 될 때까지 모든 가능한 배열을 생성합니다. A = {10, 15, 25} B가두 개의 정렬 된 배열
얻어진 배열은 {1, 5, 20, 30}이다 = : [생성 된 배열 B.
예에서 요소로 끝나야 10 ~ 20], [10 20 25 30], [10 30], [15 20], [15 20 25 30], [15 30], [25 30] 제안 된 해결책 :
public static void main(String[] args) {
int[] A = {10, 15, 25};
int[] B = {1, 5, 20, 30};
Stack<Integer> st = new Stack<>();
for (int i = 0; i < A.length; i++) {
st.push(A[i]);
generateArrays(A, B, i, 0, st, false);
st.clear();
}
}
static void generateArrays(int ar1[], int ar2[], int index_of_a, int index_of_b, Stack<Integer> st, boolean first) {
if (index_of_a >= ar1.length || index_of_b >= ar2.length) {
st.pop();
return;
}
// take from second if available
if (!first) {
for (int j = index_of_b; j < ar2.length; j++) {
if (ar1[index_of_a] < ar2[j]) {
st.push(ar2[j]);
System.out.println(st);
generateArrays(ar1, ar2, index_of_a + 1, j, st, true);
}
}
}
// take from first if available
else if (first) {
for (int i = index_of_a; i < ar1.length; i++) {
if (ar1[i] > ar2[index_of_b]) {
st.push(ar1[i]);
generateArrays(ar1, ar2, i, index_of_b + 1, st, false);
}
}
}
st.pop();
}
주어진 입력 예제로 직접 알고리즘을 실행 한 후에는 [10 30], [15 30]을 얻지 못했습니다. 배열. B의 및 인덱스 인덱스 내로 진행되지 I 또는 J의 루프마다 감소되는
그래서,이뿐만 아니라, 코드를 디버깅하여 이해하려고 발견 첫 번째 값은 a = 0의 인덱스와 b = 1의 인덱스를 얻을 때까지 값을 변경합니다. 왜 그런 일이 발생합니까? algortihm 처형의 흐름에서 나는 무엇을 놓치고 있습니까? 알고리즘은 출력에서 [10 30], [15 30]을 어떻게 얻습니까?
나는 당신의 질문을 잘 이해하지 못합니다. 배열 출력에 [10, 30] 및 [15, 30]이 나타나지 않습니까? –
명확하지 않은 것으로 생각하여 질문에 약간의 수정을가했습니다. 그들은 나타나지만 나는 어떻게 이해하지 못합니다. – SarahData
각 호출마다 매개 변수를 간단히 전환하여 '첫 번째'매개 변수를 저장할 수 있습니다. 즉, 'a'가 'b'가되고, 반대의 경우는 각 호출에서 사용되며 짝수 개의 매개 변수가있는 솔루션 만 수락 할 수 있습니다. 코드의 중복을 상당히 줄일 수 있습니다. 예 :'generateArray (arr1, arr2, indexA, indexB, stack) {acceptIf (stack.size() % 2 == 0); ... generateArray (arr2, arr1, indexB, indexA, stack); ...}'의사 코드로. – Paul