我有一个序列需要作为输出..它是 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
接下来我需要的是创建一个 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;
我刚刚将
a
更新为 0,而不是 1。因此数字 1 将显示在您的控制台中。
正如您所描述的,当达到 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));
抱歉让您超载了。我必须承认,我没有仔细阅读你问题中的所有文字。特别是您的多动症情况。不用担心,我会尝试更详细地解释我现在所做的事情,以便您能够遵循:
for()
循环中 - 就像 Alexey 的解决方案一样:for (var a = 0, b = 1; b < max;)
这意味着
a
和 b
将被设置为包含值 0
和 1
(这两个赋值项由 ,
运算符分隔)。for
表达式的第二部分(b < max
)检查b
是否仍低于最大值max
,然后才会执行循环表达式。;
分隔符后面)不存在。[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
。由于我不确定您想从函数返回哪个值,所以我选择在数组中返回两个值:一个低于目标值,一个高于目标值
max
。
return [a,b];
您可以调整退货声明以更好地满足您的需求:
return a;
或return b;
。
var
而不是let
请注意,我在后续版本的
var a=0, b=1
循环中使用了 let a=0, b=1
而不是 for()
,因为我需要在 for()
循环范围之外访问这些变量。 var
定义了一个具有函数作用域(而不是块作用域)的变量。
我希望这比我公认的相当神秘的第一个版本对您有更多帮助。
替代版本(变体)
如果您正在寻找一个可以重新调整斐波那契数列第 n 个值的函数,您可以这样做:
function fib(n) {
if (--n<0) return 0;
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<50; i++) console.log(`fib(${i}):`,fib(i));