Приведенный ниже код даст желаемый результат:
(Он написан на Java, закомментируйте, если вам нужна помощь в переводе на язык C)
Результат:
hey hey hey
hey hey hi
hey hey hello
hey hey
hey hi hey
hey hi hi
hey hi hello
hey hi
hey hello hey
hey hello hi
hey hello hello
hey hello
hey
hi hey hey
hi hey hi
hi hey hello
hi hey
hi hi hey
hi hi hi
hi hi hello
hi hi
hi hello hey
hi hello hi
hi hello hello
hi hello
hi
hello hey hey
hello hey hi
hello hey hello
hello hey
hello hi hey
hello hi hi
hello hi hello
hello hi
hello hello hey
hello hello hi
hello hello hello
hello hello
hello
Используемый рекурсивный «алгоритм»:
public static void alg (ArrayList<String[]> result, String list [], String [] left, int current_index){
if ( current_index == list.length ) {
return ;
}
for ( int i = 0; i < list.length ; i ++ ){
String [] new__list = concat(left, new String [] {list[i]});
alg (result, list, new__list, current_index+1);
result.add(new__list);
}
}
Полный код:
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
//concatenate 2 string arrays
static String [] concat (String [] s1, String [] s2){
String [] result = new String [s1.length + s2.length];
for ( int i = 0 ; i < result.length ; i ++ ){
if ( i < s1.length){
result[i] = s1[i];
}else {
result[i] = s2 [i - s1.length];
}
}
return result;
}
//The algorithm
public static void alg (ArrayList<String[]> result, String list [], String [] left, int current_index){
if ( current_index == list.length ) {
return ;
}
for ( int i = 0; i < list.length ; i ++ ){
String [] new__list = concat(left, new String [] {list[i]});
alg (result, list, new__list, current_index+1);
result.add(new__list);
}
}
public static void main(String[] args) {
String [] list = {"hey", "hi", "hello"};
ArrayList <String[]> result = new ArrayList <String[]> () ;
alg (result, list, new String [] {}, 0);
//Print the result list
for ( int i = 0 ; i < result.size() ; i ++ ){
for (int j = 0 ; j < result.get(i).length ; j ++ ){
System.out.print(result.get(i)[j] + " ");
}
System.out.println();
}
}
}