Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么javascript中这个产量生成器的迭代次数错误?_Javascript_Iteration_Generator_Bubble Sort_Yield Keyword - Fatal编程技术网

为什么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或只使用empty
while
loopYour
do。。。而
循环在每次迭代中调用
.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(","));
}