英文:
Return inside for loop return initial value
问题
在FOR循环中的RETURN语句总是返回初始的fact值(即fact = 1)是因为它在循环的第一次迭代中就被执行了。如果你希望返回阶乘的最终结果,你应该把RETURN语句移动到FOR循环之外,以便在循环结束后返回最终的fact值。以下是修改后的代码:
const factorial = function(a) {
let fact = 1;
if (a === 0) {
return 1;
} else {
for (let i = 1; i <= a; i++) {
fact *= i;
}
return fact; // 把RETURN移到FOR循环之外
}
};
这样修改后,函数将正确返回输入值的阶乘而不是初始的fact值。
英文:
I have a problem to understand why does RETURN in FOR loop returns me always initial fact value (let fact = 1):
const factorial = function(a) {
let fact=1;
if(a===0){
return 1;
}
else{
for(let i=1; i<=a; i++){
fact*=i;
return fact;** // This return
}
return fact
}
return fact;
};
//Result for all values e.g 1,5,10 is always 1, as in initial let fact =1
And when I remove it, my factorial function works totally fine. I have no idea why does it happen:
const factorial = function(a) {
let fact=1;
if(a===0){
return 1;
}
else{
for(let i=1; i<=a; i++){
fact*=i;
//Nothing
}
return fact
}
return fact;
};
// Code works fine, I receive factorial correctly
I was expecting to return factorial of my initial value. Instead I receive the initial variable value(1).
答案1
得分: 4
如果我理解你的问题正确,你想知道为什么在第一个代码中,无论输入值是什么,都会得到返回值 1
。这是因为你在 for
循环内部有一个 return
语句,这意味着你的 for
循环只会执行一次,然后返回值为1。实际上,for
循环没有迭代,这意味着你永远无法计算阶乘的值,即 fact = 1 * 2 * 3 * ...,你只执行了初始步骤,即 fact = 1。
const factorial = function(a) { // <- 你已经测试了这个函数,分别用1、5和10作为参数
let fact=1; // <- 这里将 fact 变量的值设置为1
if(a===0){ // <- 你检查传入的值是否等于1,但你使用了1、5和10,因此这里不会返回值1
return 1; // 因为你的条件中使用了1、5和10,所以这里不会返回值1
}
else{ // <- 当 a 的值不等于0 时,进入此代码块
for(let i=1; i<=a; i++){ // <- 将 i 的值设置为1,并进入 for 循环
fact*=i; // <- 将 fact 的值,初始为1,与 i 的值相乘,i 也是1,因此 fact=1
return fact; // <- 在这里返回 fact 的值,即1
}
return fact
}
return fact;
};
英文:
If I've understood your question correctly, you are wondering why did you get a return value of 1
in the first code regardless of the input value. That is because you had a return
statement inside your for
loop, which meant that your for loop would only be entered once and then exited with a return value of 1. Essentially, for
loop never iterates, which means that you never get to calculate the value of factorial as fact = 1 * 2 * 3 * ..., you only do the initial step, which is fact = 1.
const factorial = function(a) { // <- you have tested this with 1,5 and 10
let fact=1; // <- here you set fact variable to value of 1
if(a===0){ // <- you check if you sent value is equal to 1,
return 1; // since you have used 1, 5 and 10 you will not be returning a value of 1 here
}
else{ // <- you enter this block of code when the value of a≠0
for(let i=1; i<=a; i++){ // <- you set the value of i to 1 and you enter the for loop
fact*=i; // <- you multiple your fact value, which is 1, with a value of i, which is also 1, which means you will get fact=1
return fact; // <- you return a value of fact, which is 1 here!
}
return fact
}
return fact;
};
答案2
得分: 2
return
操作符不仅会中断 for
循环,还会停止整个函数的执行1。
因此,当您在 for
循环内部没有任何条件地使用 return
时,该返回语句会在该循环的第一次迭代(fact
为1时)中停止整个函数的执行。
这意味着,您的代码:
const factorial = function(a) {
let fact=1;
if(a===0){
return 1;
}
else{
for(let i=1; i<=a; i++){
fact*=i;
return fact; // 这个 return
}
return fact
}
return fact;
};
实际上等同于:
const factorial = function(a) {
let fact=1;
if (a === 0){
return 1;
} else {
let i = 1;
fact *= i;
return fact;
}
};
for
循环内部使用 return
操作符的有效条件示例:
function isAnyStringInside(values) {
for (let i = 0; i < values.length; i += 1) {
if (typeof values[i] === 'string') {
return true;
}
}
return false;
}
isAnyStringInside([1,2,3,4,5,'Hello',2,3,4,5]); // true
isAnyStringInside([1,2,3,4,5,2,3,4,5]); // false
英文:
return
operator does not breaking only for
loop: it goes deeper and stops whole function.
So, when you left return
inside for
without any condition, the return stops whole function at the first iteration of that loop (when fact
is 1).
That means, that your code:
const factorial = function(a) {
let fact=1;
if(a===0){
return 1;
}
else{
for(let i=1; i<=a; i++){
fact*=i;
return fact; // This return
}
return fact
}
return fact;
};
In fact, is equal to:
const factorial = function(a) {
let fact=1;
if (a === 0){
return 1;
} else {
let i = 1;
fact *= i;
return fact;
}
};
Example of valid condition for return
operator inside for
loop:
function isAnyStringInside(values) {
for (let i = 0; i < values.length; i += 1) {
if (typeof values[i] === 'string') {
return true;
}
}
return false;
}
isAnyStringInside([1,2,3,4,5,'Hello',2,3,4,5]); // true
isAnyStringInside([1,2,3,4,5,2,3,4,5]); // false
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论