Я ПОКА не могу этого сделать, это был я, когда столкнулся с вызовом Ханойской башни. Но с помощью Javascript Assignment и Recursively мне удалось.
Что такое Ханойская башня?
Это просто задача, в которой вам нужно переместить диск с первого стержня на последний.
Как решить Ханойскую башню одним диском?
Просто переместите его с первого стержня на последний стержень.
Как решить Ханойскую башню с двумя дисками?
Звучит легко, верно? Извините, что прерываю ваш мыслительный процесс. Но нужно соблюдать некоторые правила
- Перемещайте только один диск за раз.
- Диск большего размера не может быть помещен поверх диска меньшего размера.
- Все диски, кроме перемещаемого, должны быть на шпильке
Таким образом, нашим идеальным ответом было бы
Теперь у каждого решателя проблем должны быть рассуждения, логика и, в нашем случае, псевдокод. Теперь изображение объясняет нашу логику после рассуждений, поэтому давайте набросаем простой псевдокод.
- определите свою функцию (решить ханойскую башню)
- передать два аргумента (начало и цель, представляющие первую привязку и последнюю)
- объявить переменную для промежуточного хранения
- объявить переменную для хранения шагов
- заполнить шаги в переменной для хранения шагов
- Вернуть значение, содержащее шаги
- закрыть функцию
- вызвать функцию со значениями
Веселая часть
// Declare our function function solveHanoi(firstpeg, lastpeg){ // determine intermediate by using an outside function const intermediate = determineIntermediate(firstpeg, lastpeg); // DECLARE A VARIABLE TO STORE OUR ANSWER const answer; // according to the image above we move the top disc to the intermediate answer = output(firstpeg, intermediate); // then move remaining disc to last peg answer += output(firstpeg, lastpeg); // then move intermediate peg to last peg answer += output(intermediate, lastpeg); return answer; } // function to diplay our steps function output(a, b){ // always remember we used back ticks return `${a}->${b}`; // back ticks in use also called template literals } // function to determine middle peg function determineIntermediate(firstpeg, lastpeg){ // declare a variable to store middle peg let middlepeg; // we know we have three pegs we anotate them by having an array of [1, 2, 3] let anotation = [1, 2, 3]; // filter a value which is not the first peg nor the last peg // thats how we determine our middle peg middlepeg = anotation.filter((value) => value !== firstpeg && value !== lastpeg); return middlepeg; }
так что это решает два диска, а как насчет трех дисков, четырех дисков или пяти дисков?
Рекурсивный
Слышали о русских куклах? если не открыть новую вкладку и выполнить быстрый поиск, то вернуться.
Рекурсивный в самом простом из слов относится к повторяющемуся процессу, выходные данные которого на каждом этапе применяются в качестве входных данных на последующем этапе.
Мы используем рекурсию, чтобы решить ее быстрее.
Как же так?
Веселая часть
// function to solve the recurssion function towerOfHanoi(numberofdiscs){ // We pass on number of discs but again we must have three pegs so? // declare another function to do the recursion const recurse = doRecursion(numberofdiscs, 1, 2, 3); return recurse; } // we will now initaite the function but with different representation of arguments function doRecursion(n, firstpeg, intermediate, lastpeg){ // Define base case // Define result where to store result if(n === 0){ return; } // recursive case // move the disc recursively from first peg to intermediate through lastpeg doRecursion(n-1, firstpeg, lastpeg, intermediate); // display the answer console.log(`${firstpeg}->${lastpeg}`); // Move disc recursively from intermediate peg to last peg doRecursion(n-1, intermediate, firstpeg, lastpeg); } // call the function with steps towerOfHanoi(4);
и вуаля 💻
Резюме
что такое Ханойская башня?
Как вы решаете это с одним диском?
Как решить рекурсивно?
Надеюсь, что это был полезный комментарий к большему количеству алгоритмов для решения. И как улучшить мою.