2

My homework assignment has me check for all possible cycle notations from user inputted numbers. I have the input sent into an array but i'm not sure how to start the loop. How could I edit this loop to not display the same numbers more than once? Sorry if this isn't proper format, first time posting.

// example of user input
var permutation = [ 9,2,3,7,4,1,8,6,5 ] ;   

// add zero to match index with numbers
permutation.unshift(0) ;

// loop to check for all possible permutations
for (var i = 1; i < permutation.length -1; i++)
{
    var cycle = [];
    var currentIndex = i ;
    if ( permutation [ currentIndex ] == i )
        cycle.push(permutation [currentIndex]);
    while ( permutation [ currentIndex ] !== i )
    {
        cycle.push( permutation [currentIndex]);
        currentIndex = permutation [ currentIndex ] ;
    }

    // display in console
    console.log(cycle);
}
Thum Choon Tat
  • 3,084
  • 1
  • 22
  • 24
  • What is your expected output for your example input? Would it be `[1, 9, 5, 4, 7, 8, 6] [2] [3]`? If so, you can keep track of "visited" numbers with a set or an array of booleans for each index as you iterate. –  Nov 03 '16 at 04:32

1 Answers1

0

I answered a similar question here. The idea is to use recursive functions.
Here's a sample:

var array = ['a', 'b', 'c'];
var counter = 0; //This is to count the number of arrangement possibilities

permutation();
console.log('Possible arrangements: ' + counter); //Prints the number of possibilities

function permutation(startWith){
    startWith = startWith || '';
    for (let i = 0; i < array.length; i++){
        //If the current character is not used in 'startWith'
        if (startWith.search(array[i]) == -1){
            
                
            //If this is one of the arrangement posibilities
            if ((startWith + array[i]).length == array.length){
                counter++;
                console.log(startWith + array[i]); //Prints the string in console
            }
                
            //If the console gives you "Maximum call stack size exceeded" error
            //use 'asyncPermutation' instead
            //but it might not give you the desire output
            //asyncPermutation(startWith + array[i]);
            permutation(startWith + array[i]); //Runs the same function again
        }
        else { 
            continue; //Skip every line of codes below and continue with the next iteration
        } 
    }
    function asyncPermutation(input){
        setTimeout(function(){permutation(input);},0);
    }
 }
Community
  • 1
  • 1
Thum Choon Tat
  • 3,084
  • 1
  • 22
  • 24