为什么javascript中这个产量生成器的迭代次数错误?
下面是我正在尝试使用的代码片段为什么javascript中这个产量生成器的迭代次数错误?,javascript,iteration,generator,bubble-sort,yield-keyword,Javascript,Iteration,Generator,Bubble Sort,Yield Keyword,下面是我正在尝试使用的代码片段 function* genBubble(arr) { for (let i = 0; i < arr.length - 1; i++) { for (let j = 0; j < arr.length - i - 1; j++) { yield arr; // returning arr after every iteration if (arr[j] > arr[j + 1]) { swap(
function* genBubble(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
yield arr; // returning arr after every iteration
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1); // removed swap for brevity
}
}
}
}
const tempArray = [3, 5, 8, 4, 1, 9, -2];
const genForLoop = genBubble(tempArray);
do {
console.log(genForLoop.next());
} while (!genForLoop.next().done);
我正在使用node test.js
运行这个程序(test.js是编写这个程序的文件)
注意:我不想在每次迭代后打印数组。我想退货。如果有帮助的话。您的主要问题是您正在调用
next
两次,但忽略了每隔一次调用的值。相反,只需将其称为一次,并记住结果:
let result;
while (!(result = genForLoop.next()).done) {
console.log(result.value.join(","));
}
…或者更简单地说,使用for of
(这意味着您不必具有genForLoop
标识符):
但是(我已经多年没有做过冒泡排序了)我相信你的内环终止需要是j
,而不仅仅是j
。我确实隐约记得,内部循环可以更短,但显然不是这样
实例:
功能交换(arr、i1、i2){
常数t=arr[i1];
arr[i1]=arr[i2];
arr[i2]=t;
}
函数*GENBUBLE(arr){
for(设i=0;iarr[j+1]){
交换(arr,j,j+1);//为了简洁起见删除了交换
}
}
}
}
常量tempArray=[3,5,8,4,1,9,-2];
for(genBubble的常量值(tempArray)){
console.log(value.join(“,”);
}
。作为控制台包装器{
最大高度:100%!重要;
}
您的主要问题是您正在调用next
两次,但忽略了其他每次调用的值。相反,只需将其称为一次,并记住结果:
let result;
while (!(result = genForLoop.next()).done) {
console.log(result.value.join(","));
}
…或者更简单地说,使用for of
(这意味着您不必具有genForLoop
标识符):
但是(我已经多年没有做过冒泡排序了)我相信你的内环终止需要是j
,而不仅仅是j
。我确实隐约记得,内部循环可以更短,但显然不是这样
实例:
功能交换(arr、i1、i2){
常数t=arr[i1];
arr[i1]=arr[i2];
arr[i2]=t;
}
函数*GENBUBLE(arr){
for(设i=0;iarr[j+1]){
交换(arr,j,j+1);//为了简洁起见删除了交换
}
}
}
}
常量tempArray=[3,5,8,4,1,9,-2];
for(genBubble的常量值(tempArray)){
console.log(value.join(“,”);
}
。作为控制台包装器{
最大高度:100%!重要;
}
你的做。。。而循环在每次迭代中调用.next()
函数两次。哇,这的确是真的。如何只调用一次,同时检查是否已完成?x=genForLoop.next()代码>在循环内?将返回值存储在变量中,然后在while
条件下检查此变量。事实上,.next()
是一个调用,而不是一个值。如何只调用一次,同时检查是否已完成?删除do..while
body或只使用emptywhile
loopYourdo。。。而循环在每次迭代中调用.next()
函数两次。哇,这的确是真的。如何只调用一次,同时检查是否已完成?x=genForLoop.next()代码>在循环内?将返回值存储在变量中,然后在while
条件下检查此变量。事实上,.next()
是一个调用,而不是一个值。如何只调用一次,同时检查是否已完成?删除do..while
body或只使用空while
loop谢谢,但是确实需要arr.length
吗arr.length-1
因为我们不需要检查冒泡排序中的最后一次迭代,因为它已经在正确的位置了,对吗?我确实点击了刷新。我正在讨论“你的外循环条件应该是j
得到的结果不正确,但用j
得到的结果正确。我已经好几年没有做过泡沫排序了,我认为有一个选项你可以在那里做,但显然不是那个。但我认为,主要的问题根本不是关于冒泡排序的实现,而是如何使用生成器。是的,我认为有多种方法可以通过在外循环或内循环中交换边缘大小写来编写冒泡排序。谢谢,但是真的需要arr.length
arr.length-1
因为我们不需要检查冒泡排序中的最后一次迭代,因为它已经在正确的位置了,对吗?我确实点击了刷新。我正在讨论“你的外循环条件应该是j
得到的结果不正确,但用j
得到的结果正确。我已经好几年没有做过泡沫排序了,我认为有一个选项你可以在那里做,但显然不是那个。但我认为,主要的问题根本不是关于冒泡排序的实现,而是如何使用生成器。是的,我认为有多种方法可以通过在外循环或内循环中交换边缘大小写来编写冒泡排序。
for (const value of genBubble(tempArray)) {
console.log(value.join(","));
}