others/hanoi.js

(function (exports) {
  'use strict';

  /**
   * Returns all movements needed to solve Hanoi Tower problem.
   *
   * @public
   * @module others/hanoi
   *
   * @example
   *
   * var hanoi = require('path-to-algorithms/src/others/hanoi').hanoi;
   * var movements = hanoi(3, 'a', 'b', 'c');
   *
   * // Move a to c
   * // Move a to b
   * // Move c to b
   * // Move a to c
   * // Move b to a
   * // Move b to c
   * // Move a to c
   * movements.forEach(function (move) {
   *   console.log('Move', move[0], 'to', move[1]);
   * });
   *
   * @param {Number} count Count of the plates/stones.
   * @param {String|Number} source Identifier of the 1st peg.
   * @param {String|Number} intermediate Identifier of the 2nd peg.
   * @param {String|Number} goal Identifier of the 3rd peg.
   * @return Array which contains all the moves required
   * in order to place all the plates onto the last peg.
   */
  function hanoi(count, source, intermediate, goal, result) {
    result = result || [];
    if (count === 1) {
      result.push([source, goal]);
    } else {
      hanoi(count - 1, source, goal, intermediate, result);
      result.push([source, goal]);
      hanoi(count - 1, intermediate, source, goal, result);
    }
    return result;
  }

  exports.hanoi = hanoi;

})(typeof window === 'undefined' ? module.exports : window);