Anche se mi piacciono le ricorsioni e capisco, non riesco a padroneggiarlo! Sono bloccato con un problema che so che la ricorsione può risolvere, ma non so come.
Ho una serie di stringhe come: "cento", "cinquanta", "trentacinque" ecc. Ho "x" numero di posti per sistemarli ma la condizione è, la stringa che segue al posto successivo dovrebbe sempre essere minore uguale o uguale alla stringa che lo precede.
Ad esempio: Array di stringhe: "cento", "cinquanta", "trentacinque"
Numero di posti: 4
Poche delle possibilità corrette:
- "centocinquecento, cinquanta"
- "centodecentonovantatrè"
- "centocinquanta, cinquanta"
- "cento, cinquanta, trentacinque"
- ecc.
Esempi di possibilità errate:
- cinquanta, cento , centotrentatre
- cento, cinquanta, cento , trentacinque
Con il meglio che potessi pensare, ho creato una funzione ricorsiva in cui provo a posizionare queste stringhe e quindi ad aumentare i parametri in modo che lo stesso compito venga ripetuto in ricorsione per il resto degli slot. Fiddle qui: link
function invokePermutation()
{
var permutation_array = [];
var currentPositions = {
row: 0,
column: 0
};
getComponentPermutations (["hundred", "fifty", "thirtythree"], permutation_array, 4, currentPositions);
console.log(permutation_array.join("\n"));
var title = document.getElementById('container');
title.innerHTML = permutation_array.join("<br />");
}
function getComponentPermutations(modeArray, permutation_array, max_positions, current_positions) {
// Stopping condition
if (max_positions === current_positions.column && modeArray.length) {
current_positions.column = 0; // Reset column
current_positions.row = current_positions.row + 1; // Move to next row
}
else{
for (i = 0; i < modeArray.length; i++) {
if (0 === current_positions.column) {
// http://stackoverflow.com/a/29881936/260665
permutation_array[current_positions.row] = [];
}
permutation_array[current_positions.row][current_positions.column] = modeArray[i];
// Lets move to next position in column
current_positions.column = current_positions.column + 1;
// The array which we pass for recursion can only have the current modeArray and items lesser than it. For ex, if currenty iteration has fifty, we have to generate an array with fifty and thirtythree to pass on. It should not have hundred in it!
var newModeArray = modeArray.slice(i);
getComponentPermutations(newModeArray, permutation_array, max_positions, current_positions); // Recursion
}
}
}
Tuttavia, i risultati non sono quelli che mi aspetto, non elencano tutte le possibilità.
Sono sicuro che il mio codice / algoritmo è sbagliato, ma non capisco qual è la strada giusta! Apprezzo se qualcuno mi può aiutare a capire dove sto andando male e come risolvere questo problema.