返回总和的for循环函数[重复]

问题描述 投票:0回答:3

我有一个序列需要作为输出..它是 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()
javascript for-loop sequence
3个回答
1
投票

function calc () {
  for (let a = 0, b = 1, c = 0; c < 8;) {
    c = a + b;
    a = b;
    b = c;
    console.log(c);
  }
}
calc();

它能按您的需要工作吗? 这里的主要思想是:在循环中您可以使用任何变量来设置初始状态、增量和中断条件。

更新

循环只是重复您在没有循环的情况下所做的事情。让我们看看代码的每个部分都去了哪里。

循环声明包含3部分。

  1. 初始化
let a = 1;
let b = 1;

我刚刚将

a
更新为 0,而不是 1。因此数字 1 将显示在您的控制台中。

  1. 退出条件。

正如您所描述的,当达到 8 时循环应该结束。我们递增循环内的值,然后显示它。所以条件应该是

c < 8

  1. “增量”

就你而言,是

let c = a + b;
a = b; // 1
b = c; // 2

该块重复多次并且包含超过 1 个作业。所以我们把它放在块内,并将“增量”部分留空。


0
投票

听起来您正在尝试输出斐波那契数列(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();


0
投票

是的,斐波那契数列 - 多么有趣! 这是它的一个稍微精简的版本,只有两个变量(

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.我的循环设置在
for()
循环中 - 就像 Alexey 的解决方案一样:
for (var a = 0, b = 1; b < max;)

这意味着

  • 最初变量
    a
    b
    将被设置为包含值
    0
    1
    (这两个赋值项由
    ,
    运算符分隔)。
  • for
    表达式的第二部分(
    b < max
    )检查
    b
    是否仍低于最大值
    max
    ,然后才会执行循环表达式。
  • 第三个表达式(位于
    ;
    分隔符后面)不存在。
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 a;
return b;

4.
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));

© www.soinside.com 2019 - 2024. All rights reserved.