Оригинальный вопрос здесь: Декартова сила (специальный декартовский продукт) - выберите элементы из массива, в повторяемом стиле
В старом вопросе уже есть ответы, которые далирешение с помощью итерации.
Мне интересно, существует ли рекурсивное решение, аналогичное решению по следующей ссылке, которое печатает перестановки с рекурсией: https://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/
В настоящее время я написал следующую программу, которая еще не верна, какая-либо помощь?
Код - реализация
CartesianPowerRecursive.java:
import java.util.Arrays;
/**
* Print cartesian power of array elements, by recursion.
*
* @author eric
* @date Oct 13, 2018 12:28:10 PM
*/
public class CartesianPowerRecursive {
public static int cartesianPower(int arr[]) {
int tmpArr[] = Arrays.copyOf(arr, arr.length);
return cartesianPower(arr, tmpArr, 0, 0);
}
private static int cartesianPower(int arr[], int tmpArr[], int n, int m) {
// FIXME ... not correct yet,
int counter = 0;
for (int i = n; i < arr.length; i++) {
for (int j = m; j < arr.length; j++) {
tmpArr[j] = arr[i];
counter += cartesianPower(arr, tmpArr, n, j + 1);
}
}
if (m == arr.length - 1) {
counter++;
System.out.println(Arrays.toString(tmpArr));
}
return counter;
}
}
Код - контрольный пример
(через TestNG )
CartesianPowerRecursiveTest.java:
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* CartesianPowerRecursive test.
*
* @author eric
* @date Oct 26, 2018 11:45:27 PM
*/
public class CartesianPowerRecursiveTest {
@Test
public void test() {
int arr[] = new int[] { 0, 1, 2 };
Assert.assertEquals(CartesianPowerRecursive.cartesianPower(arr), 27);
}
}