gpt4 book ai didi

javascript - 为什么这在 JS 而不是 PHP 中有效?

转载 作者:行者123 更新时间:2023-11-30 00:19:55 26 4
gpt4 key购买 nike

前段时间在编码学校做了一个 JS 项目,我们使用 Eratosthenes 筛法(我无法不读到那种洪亮、 echo 的声音)来输出所有素数直到用户输入的数字。我们为此提出的代码是:

JavaScript 代码示例

var primeSifter = function(number) {
var numArray = numberList(number);
var prime = 2;
var count = 0;
while (prime <= number) {
numArray.forEach(function(num) {
if ((num !== prime) && (num % prime === 0)) {
numArray.splice(numArray.indexOf(num), 1);
}
});
count++;
prime = numArray[count];
}
return numArray;
}

numberList() 只是一个函数,它创建一个从 2 到用户输入的任何数字的数字数组。

count++;
prime = numArray[count];

此处的想法是通过将素数设置为等于 numArray 的下一个索引位置(应该是下一个最大的素数)来跳过查找已经删除的数字的倍数。 这就是我想要弄清楚如何在 PHP 中实现的内容。我可以确认这可行。然而在 PHP 中...

PHP 代码示例

在未经编辑的原始帖子中,我使用了 unset 而不是 array_splice。根据 A Sad Dude 的回答,我开始和他们一起玩。

无论我是 unset 还是 array_splice,这段代码都会给出如下所示的错误。

function number_list($input) {
$numList = array();
for ($i = 2; $i <= $input; $i++) {
array_push($numList, $i);
}
return $numList;
}

function sift_primes($input) {
$numArray = number_list($input);
$prime = 2;
$count = 0;
while ($prime <= $input) {
foreach ($numArray as $key => $num) {
if (($num !== $prime) && ($num % $prime === 0)) {
array_splice($numArray, $key, 1);
}
}
$count++;
$prime = $numArray[$count];
}
return $numArray;
}

这就是我最初来到这里的目的:这两个函数在 JS 和 PHP 中有何根本不同?


以下是原始问题的延伸:

我发现让这个函数返回有效输出的唯一方法是替换:

$count++;
$prime = $numArray[$count];

与:

$prime++;

然而,即使它给我一个输出,unsetarray_splice 也会给我不同的结果。

这段代码输出Array ( [0] => 2 [1] => 3 [2] => 5 [3] => 9 ),这是不正确的,因为9显然是不是素数:

function sift_primes($input) {
$numArray = number_list($input);
$prime = 2;
$count = 0;
while ($prime <= $input) {
foreach ($numArray as $key => $num) {
if (($num !== $prime) && ($num % $prime === 0)) {
array_splice($numArray, $key, 1);
}
}
$prime++;
}
return $numArray;
}

unset($numArray[$key]) 替换 array_splice 返回:
Array ( [0] => 2 [1] => 3 [3] => 5 [5] => 7 ),正确答案。

主要问题:

问题不是“如何获得我想要的输出?”我相信我已经想出如何做到这一点。我真的很想了解这两种语言的幕后发生了什么,以便在 JS(上面的第一个代码块)中使有效方法成为 PHP 中的无效方法(具体来说,为什么我不能设置 $prime 成为拼接非素数后数组中的下一个素数?)。看起来他们在基本层面上处理拼接的方式不同(显然 PHP 甚至处理 unsetarray_splice 的方式也不同,这可能是第一个问题的扩展),这似乎是一件非常值得理解的事情。

错误信息

上面引用了这些

Notice: Undefined offset: 2 in /Users/Guest/Desktop/test/sift.php on line 23

Warning: Division by zero in /Users/Guest/Desktop/test/sift.php on line 18

Warning: Division by zero in /Users/Guest/Desktop/test/sift.php on line 18

Warning: Division by zero in /Users/Guest/Desktop/test/sift.php on line 18

Warning: Division by zero in /Users/Guest/Desktop/test/sift.php on line 18

Notice: Undefined offset: 4 in /Users/Guest/Desktop/test/sift.php on line 23

Warning: Division by zero in /Users/Guest/Desktop/test/sift.php on line 18

不断地...

编辑

我继续进行了一些重新排列/格式化,以尝试更好地阐明问题。这主要是为了回应“一个悲伤的家伙”的回复,他在回复中建议使用 array_splice 而不是 unset。推理的似乎很有道理,但我发现似乎并没有达到预期的结果。

感谢所有花时间阅读本文的人。第一次尝试在这里获得答案,如果我让它变得比需要的更困难,我深表歉意。

最佳答案

unset($a[idx])splice 更像 a[idx] = undefined

你可以自己检查一下:

$a = [0, 1, 2, 3];
unset($a[1]);
print_r($a);

将导致:

Array
(
[0] => 0
[2] => 2
[3] => 3
)

因此,通过采用 $prime = $numArray[$count];,您将找到那些将转换为 0 以进行除法运算的空白点。实际上,您应该使用 array_splice,或者重新组织您的代码。

关于javascript - 为什么这在 JS 而不是 PHP 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33533742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com