我正在尝试打印两个给定数字(num1
和num2
)之间的所有素数。如果我在isPrime
函数的for循环中使用其他变量名,则该变量名将按预期工作。但是,在使用与i
相同的变量名时,它会陷入无限循环。请帮助我理解这一点。提前致谢。
下面是我的代码:
showPrimeNumbers();
function showPrimeNumbers(){
var num1 = 10;
var num2 = 15;
for (i=num1; i<=num2; i++){
if(isPrime(i)){
console.log(i+" is a prime number.");
}
}
}
function isPrime(num){
var flag = true;
for (i=2;i<=num-1;i++){
if(num%i == 0){
flag=false;
break;
}
}
return flag;
}
答案 0 :(得分:2)
您的i
前面没有var
或let
,因此它们都引用(并隐式分配)相同的全局变量。因此,每次isPrime
运行时,i
都会重置为3或4,重复一次-永远不会达到15。
从不隐式分配全局变量。将let
放在i
前面。
让代码更清晰一些的事情,可能是简单地flag
或return false
,而不是重新分配了return true
变量:
showPrimeNumbers();
function showPrimeNumbers(){
var num1 = 10;
var num2 = 15;
for (let i=num1; i<=num2; i++){
if(isPrime(i)){
console.log(i+" is a prime number.");
}
}
}
function isPrime(num){
for (let i=2;i<=num-1;i++){
if(num%i == 0){
return false;
}
}
return true;
}
答案 1 :(得分:1)
您没有使用Traceback (most recent call last):
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\web.py", line 1543, in _execute
result = yield result
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run
value = future.result()
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1107, in run
yielded = self.gen.throw(*exc_info)
File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\sessions\handlers.py", line 73, in post
type=mtype))
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run
value = future.result()
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1107, in run
yielded = self.gen.throw(*exc_info)
File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\sessions\sessionmanager.py", line 79, in create_session
kernel_id = yield self.start_kernel_for_session(session_id, path, name, type, kernel_name)
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run
value = future.result()
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1107, in run
yielded = self.gen.throw(*exc_info)
File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\sessions\sessionmanager.py", line 92, in start_kernel_for_session
self.kernel_manager.start_kernel(path=kernel_path, kernel_name=kernel_name)
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run
value = future.result()
File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 315, in wrapper
yielded = next(result)
File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\kernels\kernelmanager.py", line 148, in start_kernel
super(MappingKernelManager, self).start_kernel(**kwargs)
File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\multikernelmanager.py", line 110, in start_kernel
km.start_kernel(**kwargs)
File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\manager.py", line 259, in start_kernel
**kw)
File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\manager.py", line 204, in _launch_kernel
return launch_kernel(kernel_cmd, **kw)
File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\launcher.py", line 128, in launch_kernel
proc = Popen(cmd, **kwargs)
File "C:\Users\Steven\Anaconda3\lib\subprocess.py", line 709, in __init__
restore_signals, start_new_session)
File "C:\Users\Steven\Anaconda3\lib\subprocess.py", line 997, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
。这意味着JavaScript会在嵌套的本地语言中向上搜索,直到找到变量var
;如果找不到变量,则会创建一个全局变量。这意味着这两个函数共享变量i
。
通过在每个函数的某个位置写入i
来解决此问题。
将来,请考虑在每个函数体的开头编写var i;
来使用严格模式。它使这类错误更容易发现。
答案 2 :(得分:0)
您的问题是您在循环中声明了i
变量而没有使用var
关键字,因此它将成为window
范围内的全局变量。
因此,两个函数都将访问相同的i
变量,并且两个函数将同时对其进行更新,因此isPrime()
会将i
变量重置为{{1 }},且不会高于2
,因此不会满足您的第一个4
循环的退出条件,因为for
将始终保持i<=num2
,即为什么会有无限循环。
在每个循环中声明true
时,只需使用它们,因此您将处理两个单独的变量,其中每个变量对于不同函数的作用域是局部的。
var
并且:
for (var i=num1; i<=num2; i++)