拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java:当且仅当所有串列编号都大于零时回传真

Java:当且仅当所有串列编号都大于零时回传真

白鹭 - 2022-02-11 1980 0 0

当且仅当所有串列编号都大于零时,我无法回传 true。当且仅当所有串列编号都大于零时,它应该回传真。-5 在串列中,但在程序运行后,它回传 true,而它应该是 false(“某些数字不是正数”)。

var allPositive = false;

var numberList = [2, -5, 1, 50, 4, 82, 34];

checkIfAllPositive();

console.log(allPositive);

if (allPositive == true)
{
  console.log("All of the numbers are positive!");
}
else
{
  console.log("Some of the numbers are not positive!");
}



function checkIfAllPositive()
{
  for (var index = 0; index < numberList.length; index  ) {
    console.log(numberList[index]   " "   index   " "  (numberList[index] > 0));
    if (numberList[index] <= 0)
    {
      allPositive = false;
    } else {
      allPositive = true;
    }
  }
}

uj5u.com热心网友回复:

当您遍历阵列时,您需要在其中一个 is 之后中断false

像这样:

function checkIfAllPositive()
{
  for (var index = 0; index < numberList.length; index  ) {
    console.log(numberList[index]   " "   index   " "  (numberList[index] > 0));
    if (numberList[index] <= 0)
    {
      allPositive = false;
      break;
    } else {
      allPositive = true;
    }
  }
}

这是因为一旦其中一个为假,它就会设定allPositive为假,但它会继续下去,如果它找到另一个正数,那么allPositive即使那里有一个负数,它也会设定为真。

uj5u.com热心网友回复:

您的函式中有一些需要调整的怪癖。

要解决您的问题,有不同的方法:

学习更有效和有用的是:

    var numberList = [2, -5, 1, 50, 4, 82, 34];

    function checkIfAllPositive(list) {
        for (var index = 0; index < list.length; index  ) {
            if (list[index] <= 0) return false
        }
        return true
    }

    var allPositive = checkIfAllPositive(numberList)
    console.log(allPositive)

访问所有阵列元素,一旦发现负数(或 0),则回传 false。如果在不回传 a 的情况下仔细阅读所有阵列元素false,则必须回传,true因为所有值都是正数。

此代码遵循一般规则尽可能避免副作用

  • 您不会更改函式体中的任何外部值。
  • 如果没有在自变量宣告中命名,您将不会读取函式中的任何值。

它们是程序员手册的第十二条和第十三条诫命。这是一条你几乎在任何地方都需要强制执行的救命规则,特别是对于 Javascript,它有一些可能会让你发疯的范围警告。

你的代码有一个严重的缺陷,除了依赖于输入和输出的副作用:当你评估串列中的一个值时,你将失去对前一个值的评估。除了我上面首选的程序解决方案之外,如果您想遵守我只推荐用于长函式的规则一进入-> 一退出你必须考虑到这一点,也许计算负值(溶胶 b)

function checkIfAllPositive(numberList)
{
  var negatives = 0;
  for (var index = 0; index < numberList.length; index  ) {
    console.log(numberList[index]   " "   index   " "   (numberList[index] > 0));
    if (numberList[index] <= 0)
    {
      negatives  = 1;
    } 
  }
  return negatives > 0;
}

或者考虑到以前的值

function checkIfAllPositive(numberList)
{
  var allPositiveSoFar = true;
  for (var index = 0; index < numberList.length; index  ) {
    console.log(numberList[index]   " "   index   " "   (numberList[index] > 0));
    if (numberList[index] <= 0)
    {
      // this is equivalent to allPosivitesSoFar = allPositiveSoFar && false;
      allPositivesSoFar = false;
      
    } else {
      allPosivitesSoFar = allPositivevSoFar && true;
  }
  return negatives > 0;
}

如果您想获得一点乐趣,您还可以使用一些函式式编程来使用阵列过滤器方法在一行中解决您的问题

var numberList = [2, -5, 1, 50, 4, 82, 34]
var allPositive = numberList.filter(a => a <= 0).length == 0
console.log(allPositive)

您反转测验并选择(即创建一个包含它们的新阵列)所有会导致错误回应的值。如果至少有一个,则表达式为假。

这是解决您的任务的一种不太有效的方法,因为即使第一个元素为负数,函式过滤器也会检查所有元素。

更好的方法是使用Array 的一些方法

var numberList = [2, -5, 1, 50, 4, 82, 34]
var allPositive = !numberList.some(a => a <= 0)
console.log(allPositive)

我认为这是不言自明的:如果没有(!)负值,数字都是正的

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *