不久前在 JS 编码学校做过一个项目,我们使用Eratosthenes 的筛子(我无法在某种蓬勃发展的回声中读到它)来输出所有素数,直到用户输入的数字。我们为此提出的代码是:
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
. 根据一个悲伤的家伙的回答,我开始和他们两个一起玩。
无论是 Iunset
还是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++;
然而,即使它给了我一个输出,unset
并array_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;
}
替换array_splice
为unset($numArray[$key])
return:
Array ( [0] => 2 [1] => 3 [3] => 5 [5] => 7 )
,正确答案。
主要问题:
问题不是“我如何获得我想要的输出?” 我相信我已经想出了如何做到这一点。我真的很想了解两种语言在幕后发生的事情,以使 JS 中的有效方法(上面的第一个代码块)在 PHP 中无效(具体来说,为什么我不能设置$prime
为拼接非素数后的数组?)。似乎他们在基本层面上处理拼接的方式不同(显然 PHP 甚至处理方式unset
也array_splice
不同,这可能是第一个问题的扩展),这似乎是一件非常值得理解的事情。
错误信息
这些都是上面引用的
注意:未定义的偏移量:第 23 行 /Users/Guest/Desktop/test/sift.php 中的 2
警告:在第 18 行的 /Users/Guest/Desktop/test/sift.php 中除以零
警告:在第 18 行的 /Users/Guest/Desktop/test/sift.php 中除以零
警告:在第 18 行的 /Users/Guest/Desktop/test/sift.php 中除以零
警告:在第 18 行的 /Users/Guest/Desktop/test/sift.php 中除以零
注意:未定义的偏移量:第 23 行 /Users/Guest/Desktop/test/sift.php 中的 4
警告:在第 18 行的 /Users/Guest/Desktop/test/sift.php 中除以零
不断地不断地......
编辑
我继续进行了一些重新排列/格式化,以尝试更好地阐明问题。这主要是为了回应“一个悲伤的家伙”的回复,他建议使用array_splice
而不是unset
. 这个推理似乎完全有道理,但我发现它似乎并没有达到预期的结果。
感谢任何花时间涉足此问题的人。第一次尝试在这里得到答案,如果我让它变得比它需要的更困难,我很抱歉。