提问人:JavaScriptStudent 提问时间:11/2/2022 更新时间:11/3/2022 访问量:131
返回 sum [duplicate] 的 for 循环函数
for loop function that returns sum [duplicate]
问:
我有一个需要作为输出的序列。这是 8 所以我所做的(当然是在朋友的帮助下......bec,我不聪明,有多动症......是这样的:
let a = 1;
let b = 1;
let c = a + b;
a = b; // 1
b = c; // 2
c = a + b; // 3
a = b; // a = 2
b = c; // b = 3
c = a + b; // 2 + 3 = 5 c = 5
接下来我需要做的是制作一个 for 循环,将其计算为 8(执行与上面完全相同的计算任务(a = b and b = c and c = a + b)
使函数得到打印输出 8..
let a = 1;
let b = 1;
let c = a + b;
a = b; // 1
b = c; // 2
c = a + b; // 3
a = b; // a = 2
b = c; // b = 3
c = a + b; // 2 + 3 = 5 c = 5
function calc () {
for (let i=0; i<= ( ? ? ? ? ? ?); i++){
console.log(i);
}
}
calc()
答:
function calc () {
for (let a = 0, b = 1, c = 0; c < 8;) {
c = a + b;
a = b;
b = c;
console.log(c);
}
}
calc();
它能根据您的需要工作吗? 这里的主要思想是:在循环中,您可以使用任何变量来设置初始状态、增量和中断条件。
更新
循环只是重复你所做的没有循环。让我们看看代码的每个部分都去了哪里。
循环声明包含 3 个部分。
- 初始化
let a = 1;
let b = 1;
我刚刚更新为 0,而不是 1。因此,数字 1 将显示在您的控制台中。a
- 退出条件。
正如你所描述的,当我们到达 8 时,循环应该结束。我们将循环中的值递增,然后显示它。所以条件应该是 .c < 8
- “增量”
就您而言,它是
let c = a + b;
a = b; // 1
b = c; // 2
此块重复多次,并包含 1 个以上的赋值。因此,我们将其放入块中,并将“增量”部分留空。
评论
听起来您正在尝试输出斐波那契数列(1、1、2、3、5、8、13...),其中序列中的每个数字都是前两个数字的总和。
function calc() {
// We need to hard-code the first two numbers in the sequence to get started
let a = 1;
let b = 1;
console.log(a);
console.log(b);
// If we do 4 loops, the last value printed will be 8
for (let i = 0; i < 4; i++) {
let c = a + b
console.log(c);
// Shift a and b along the sequence
// a gets the value held by b, and b gets the value held by c
a = b
b = c
}
}
calc();
如果您希望它只打印出 8。
function calc() {
let a = 1;
let b = 1;
for (let i = 0; i < 4; i++) {
let c = a + b
a = b
b = c
}
console.log(b); // Prints 8
}
calc();
评论
是的,斐波那契数列 - 多么有趣!
这是一个略微精简的版本,只有两个变量(和):a
b
function calc (max) {
for (let a = 0, b = 1; b < max;) console.log(([a,b] = [b,a+b])[1])
}
calc(100);
更新
这里有一个版本,它只会返回最后两个值(供以后在您的 HTML 中使用):目标值下方的最后一个值和目标值上方的第一个值:max
function calc (max) {
for (var a = 0, b = 1; b < max;) [a,b] = [b,a+b];
return [a,b];
}
console.log(calc(100));
对不起,让你超负荷。我不得不承认,我没有仔细阅读你问题中的所有文字。特别是你的多动症情况。不用担心,我会尝试更详细地解释我现在做了什么,以便您能够遵循:
1. 我的循环设置在一个循环中 - 就像在 Alexey 的解决方案中一样:for()
for (var a = 0, b = 1; b < max;)
这意味着
- 最初变量 和 将被设置为包含值 和 (两个赋值者由 -opertor 分隔)。
a
b
0
1
,
- 表达式 () 的第二部分检查是否仍低于最大值,然后才会执行循环表达式。
for
b < max
b
max
- 第三个表达式(在 -separator 后面)不存在。
;
2.循环表达式...
[a,b] = [b,a+b]
...利用了 ES6 新增的解构特性。它是其他三个单独的分配语句的简写版本:
tmp = b; // buffer the value of b
b = a+b; // do the sum and re-assign to b
a = tmp; // assign the original value of b to variable a
ES6 结构在这里很有帮助,
- 因为它在将计算结果分配给等式左侧的数组之前缓冲了右侧的计算结果。
- 只有这样(在解构阶段),新计算的值才会被分配给变量和 。
a
b
3. 返回值
由于我不确定您希望从函数返回哪个值,因此我选择在数组中返回两个值:一个低于目标值,一个高于目标值。max
return [a,b];
您可以自行调整 return 语句以更好地满足您的需求:要么 要么 .return a;
return b;
4. 代替var
let
请注意,我在更高版本的循环中使用了 INSTEAD 而不是在循环中,因为我需要在循环范围之外访问这些变量。定义一个具有函数作用域(而不是块作用域)的变量。var a=0, b=1
let a=0, b=1
for()
for()
var
我希望这能比我公认的相当隐晦的第一个版本更能帮助你。
替代版本(变体)
如果您正在寻找一个可以重新调整斐波那契数列的第 n 个值的函数,您可以这样做:
function fib (n) {
for (var a = 0, b = 1; n--;) [a,b] = [b,a+b];
return b;
}
// test the function fib with n = 1, ..., 19
for (let i=1; i<20; i++) console.log(`fib(${i}):`,fib(i));
评论