Есть некоторые части реализации Python, которые ваша реализация пропускает:
У вас есть неявно глобальная переменная x
- в отличие от Python, в Javascript переменные объявлены без var
/ let
/ *Глобальному объекту присвоено 1006 *, поэтому после завершения рекурсивных deleteMid
будет только одна переменная с именем x
(а не одна для каждой итерации), которую вы каждый раз переопределяете.Вместо этого используйте const x
, чтобы гарантировать, что каждый вызов deleteMid
имеет собственную привязку x
.
В вашем стеке нет свойства length
, поэтому результаты теста curr != Math.floor(stack.length/2)
в curr != NaN
- это не то, что вы хотите.Хотя вы можете присвоить свойству stack
a length
getter:
get length() {
return this.items.length;
}
, это все равно не соответствует реализации Python, которая непрерывно рекурсивно передает начальную длину , как ещеАргумент: если вы хотите имитировать реализацию Python, сделайте это тоже с переменной n
:
function deleteMid(stack, n, curr) {
// ...
// Remove other items
deleteMid(stack, n, curr + 1);
// Put all items back except middle
if (curr != Math.floor(n / 2)) {
// ...
// Call with:
deleteMid(stack, stack.items.length, 0);
Проблема с проверкой свойства length
состоит в том, что оно изменит , пока выитерируем , что значительно усложнит работу с ним.
По той же причине, чтобы работали стеки одинакового размера, нам также нужно изменить ваш JS-тест здесь:
if (stack.isEmpty() || curr == stack.items.length) {
для соответствия коду Python:
if (st.isEmpty() or curr == n) :
Рабочий код:
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.items.length === 0) {
return "Underflow";
} else {
return this.items.pop();
}
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length == 0;
}
print() {
console.log(this.items);
}
get length() {
return this.items.length;
}
}
function deleteMid(stack, n, curr) {
// If stack is empty or all items
// are traversed
if (stack.isEmpty() || curr === n) {
return;
}
// Remove last item
const x = stack.peek();
stack.pop();
// Remove other items
deleteMid(stack, n, curr + 1);
// Put all items back except middle
if (curr != Math.floor((n) / 2)) {
stack.push(x);
}
}
var stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.print();
deleteMid(stack, stack.items.length, 0);
stack.print();