我在js中有一个任务。我的程序应该从用户那里获取一个数字,并将其插入电源。我已经应对了正幂,但负幂的算法总是给出肯定的答案,在为零幂设置选项后,每个变体都会以某种方式返回 -1;请帮我找到一个错误。
function powX(x, pow) {
x = +prompt('Insert a number: ');
pow = +prompt('Insert a power: ');
var result;
if (x > 0) {
var result = x;
for (i = 1; i < pow; i++) {
result *= x;
}
}
if (x < 0) {
var result = x;
for (i = 1; i < Math.abs(pow); i++) {
result /= x;
}
} else {
result = 1;
}
return result;
}
console.log(powX());
代码中很少有错误:
- 您应该在第二个块中使用
else-if
而不是if
。 - 您应该检查
pow
而不是x
- 您没有将
var
或let
与i
一起使用,因此它将成为全局变量。使用let
或var
- 您在
if
块中再次使用var
,但用var
声明的变量具有函数作用域,因此不会抛出错误。但是有了let
它会破坏你的代码。不要一次又一次地重申result
。
function powX(x, pow) {
x = +prompt('Insert a number: ');
pow = +prompt('Insert a power: ');
var result;
if (pow > 0) {
result = x;
for (let i = 1; i < pow; i++) {
result *= x;
}
}
else if (pow < 0) {
result = x;
for (let i = 0; i <= Math.abs(pow); i++) {
result /= x;
}
} else {
result = 1;
}
return result;
}
console.log(powX());
你不需要两个循环一个用于除法,另一个用于使用乘法。只需通过乘以计算result
,最后将结果乘以x
或根据条件除以即可。
function powX(x, pow) {
x = +prompt('Insert a number: ');
pow = +prompt('Insert a power: ');
if(pow === 0) return 1;
var result = x;
for (let i = 1; i < Math.abs(pow); i++) {
result *= x;
}
return pow < 0 ? (x/result/x) : result;
}
console.log(powX());
对第二个条件使用 else if
,否则,其else
块将始终针对 x> 0 执行,将结果设置为 1。
function powX(x, pow) {
x = +prompt('Insert a number: ');
pow = +prompt('Insert a power: ');
var result;
if (x > 0) {
result = x;
for (i = 1; i < pow; i++) {
result *= x;
}
}
else if (x < 0) {
result = x;
for (i = 1; i < Math.abs(pow); i++) {
result /= x;
}
} else {
result = 1;
}
return result;
}
console.log(powX());
此外,如果您删除if
和else if
块中result
的重新声明,它会看起来更好。它不会影响您的输出,但仍然如此。
注意:正如@ASDFGerte评论中正确指出的那样,OP 的代码还有其他缺陷,但我认为这仍然回答了他的主要关注点和实际问题。