天道酬勤,学无止境

Why doesn't this for loop work when I simple change two expression's order [duplicate]

问题

对于以下斐波那契函数,它按预期工作:

 function fibonacci(n) { var nums = [] var a = b = 1 for (let i = 0; i < n; i++) { [a, b] = [b, a + b] nums.push(a) } return nums } console.log(fibonacci(5)); // outputs: [1,2,3,5,8]

但是在我更改了两个语句的顺序后,它不起作用:

 function fibonacci(n) { var nums = [] var a = b = 1 for (let i = 0; i < n; i++) { nums.push(a) [a, b] = [b, a + b] } return nums } console.log(fibonacci(5)); // outputs: [1,1,1,1,1]

它出什么问题了?

回答1

这是因为你漏掉了行尾的分号

nums.push(a)

所以它将这两行合并为:

nums.push(a)[a, b] = [b, a + b]

这不会重新分配ab变量,它正在索引一个数组。

你真的应该改掉省略分号的坏习惯。 Javascript 允许这样做,但正如您在此示例中看到的那样,它并不总是推断出您认为它们会出现的语句中断。

 function fibonacci(n) { var nums = []; var a = b = 1; for (let i = 0; i < n; i++) { nums.push(a); [a, b] = [b, a + b]; } return nums; } console.log(fibonacci(5)); // outputs: [1,1,1,1,1]

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • What's the most Pythonic way to identify consecutive duplicates in a list?
    I've got a list of integers and I want to be able to identify contiguous blocks of duplicates: that is, I want to produce an order-preserving list of duples where each duples contains (int_in_question, number of occurrences). For example, if I have a list like: [0, 0, 0, 3, 3, 2, 5, 2, 6, 6] I want the result to be: [(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] I have a fairly simple way of doing this with a for-loop, a temp, and a counter: result_list = [] current = source_list[0] count = 0 for value in source_list: if value == current: count += 1 else: result_list.append((current, count))
  • 在列表中标识连续重复项的最Python方式是什么?(What's the most Pythonic way to identify consecutive duplicates in a list?)
    问题 我有一个整数列表,我希望能够识别连续的重复块:也就是说,我想生成一个保留顺序的二元组列表,其中每个二元组都包含(int_in_question,出现次数)。 例如,如果我有一个类似的列表: [0, 0, 0, 3, 3, 2, 5, 2, 6, 6] 我希望结果是: [(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] 我有一个相当简单的方法,可以使用for循环,临时和计数器: result_list = [] current = source_list[0] count = 0 for value in source_list: if value == current: count += 1 else: result_list.append((current, count)) current = value count = 1 result_list.append((current, count)) 但是我真的很喜欢python的函数式编程习惯用法,并且我希望能够通过一个简单的生成器表达式来做到这一点。 但是,我发现在使用生成器时很难保留子计数。 我有一个两步走的过程,可能会把我带到那儿,但是现在我很沮丧。 是否有一种特别优雅/ Python的方式来做到这一点,尤其是对于生成器? 回答1 >>> from itertools
  • Why doesn't this for loop work when I simple change two expression's order [duplicate]
    This question already has answers here: ES6 Array destructuring weirdness (4 answers) Closed 5 years ago. For the following fibonacci function, it works as expected: function fibonacci(n) { var nums = [] var a = b = 1 for (let i = 0; i < n; i++) { [a, b] = [b, a + b] nums.push(a) } return nums } console.log(fibonacci(5)); // outputs: [1,2,3,5,8] but after I changed two statements' order, it doesn't work: function fibonacci(n) { var nums = [] var a = b = 1 for (let i = 0; i < n; i++) { nums.push(a) [a, b] = [b, a + b] } return nums } console.log(fibonacci(5)); // outputs: [1,1,1,1,1] What's
  • numpy 数组上的高效循环(efficient loop over numpy array)
    问题 已经问过这个问题的版本,但我没有找到满意的答案。 问题:给定一个大的 numpy 向量,找到重复的向量元素的索引(其变体可以与容差进行比较)。 所以问题是 ~O(N^2) 和内存限制(至少从当前算法的角度来看)。 我想知道为什么我尝试过的 Python 比等效的 C 代码慢 100 倍或更多。 import numpy as np N = 10000 vect = np.arange(float(N)) vect[N/2] = 1 vect[N/4] = 1 dupl = [] print("init done") counter = 0 for i in range(N): for j in range(i+1, N): if vect[i] == vect[j]: dupl.append(j) counter += 1 print("counter =", counter) print(dupl) # For simplicity, this code ignores repeated indices # which can be trimmed later. Ref output is # counter = 3 # [2500, 5000, 5000] 我尝试使用 numpy 迭代器,但它们更糟(~ x4-5)http://docs.scipy.org/doc
  • Can window function LAG reference the column which value is being calculated?
    I need to calculate value of some column X based on some other columns of the current record and the value of X for the previous record (using some partition and order). Basically I need to implement query in the form SELECT <some fields>, <some expression using LAG(X) OVER(PARTITION BY ... ORDER BY ...) AS X FROM <table> This is not possible because only existing columns can be used in window function so I'm looking way how to overcome this. Here is an example. I have a table with events. Each event has type and time_stamp. create table event (id serial, type integer, time_stamp integer); I
  • 如何在不使用循环的情况下在 C 中初始化 N 维数组(How to initialize N dimensional arrays in C without using loop)
    问题
  • 为什么不更改for循环的迭代部分中的pre到post增量有什么不同?(Why doesn't changing the pre to the post increment at the iteration part of a for loop make a difference?)
    问题 为什么这样 int x = 2; for (int y =2; y>0;y--){ System.out.println(x + " "+ y + " "); x++; } 打印与此相同? int x = 2; for (int y =2; y>0;--y){ System.out.println(x + " "+ y + " "); x++; } 据我所知,后增量首先被“按原样”使用,然后被增量。 先添加预增量,然后再使用。 为什么这不适用于for循环的主体? 回答1 该循环等效于: int x = 2; { int y = 2; while (y > 0) { System.out.println(x + " "+ y + " "); x++; y--; // or --y; } } 从阅读该代码可以看到,在for循环的第三部分中使用post还是pre decrement运算符并不重要。 更一般地,任何形式的for循环: for (ForInit ; Expression ; ForUpdate) forLoopBody(); 完全等同于while循环: { ForInit; while (Expression) { forLoopBody(); ForUpdate; } } for循环更紧凑,因此更容易解析这种常见用法。 回答2 为了可视化这些内容
  • Threadpools - 可能的线程执行顺序问题(Threadpools - possible thread execution order problem)
    问题 我一直在学习如何使用线程池,但我不确定池中的每个线程是否都被正确执行,我怀疑有些线程被执行了不止一次。 我已经将代码减少到最低限度,并且一直在使用 Debug.WriteLine 来尝试找出发生了什么,但这会产生一些奇怪的结果。 我的代码如下(基于(不支持 STA 线程上的多个句柄的 WaitAll 的代码)的代码): public void ThreadCheck() { string[] files; classImport Import; CountdownEvent done = new CountdownEvent(1); ManualResetEvent[] doneEvents = new ManualResetEvent[10]; try { files = Directory.GetFiles(importDirectory, "*.ZIP"); for (int j = 0; j < doneEvents.Length; j++) { done.AddCount(); Import = new classImport(j, files[j], workingDirectory + @"\" + j.ToString(), doneEvents[j]); ThreadPool.QueueUserWorkItem( (state) => { try {
  • 窗口函数 LAG 可以引用正在计算值的列吗?(Can window function LAG reference the column which value is being calculated?)
    问题 我需要根据当前记录的其他一些列和前一条记录的 X 值(使用某些分区和顺序)计算某些列 X 的值。 基本上我需要在表单中实现查询 SELECT <some fields>, <some expression using LAG(X) OVER(PARTITION BY ... ORDER BY ...) AS X FROM <table> 这是不可能的,因为在窗口函数中只能使用现有的列,所以我正在寻找如何克服这个问题的方法。 这是一个例子。 我有一张有活动的桌子。 每个事件都有type和time_stamp 。 create table event (id serial, type integer, time_stamp integer); 我不想找到“重复”事件(跳过它们)。 重复我的意思如下。 让我们按time_stamp升序对给定type的所有事件进行排序。 然后 第一个事件不是重复的所有跟随非重复并且在它之后的某个时间范围内的事件(即它们的time_stamp不大于前一个非重复的time_stamp加上一些常量TIMEFRAME )都是重复的它的下一个事件time_stamp比更多的是比以前的非重复的更大的TIMEFRAME是不重复等等 对于这个数据 insert into event (type, time_stamp) values (1, 1), (1, 2),
  • efficient loop over numpy array
    Versions of this question have already been asked but I have not found a satisfactory answer. Problem: given a large numpy vector, find indices of the vector elements which are duplicated (a variation of that could be comparison with tolerance). So the problem is ~O(N^2) and memory bound (at least from the current algorithm point of view). I wonder why whatever I tried Python is 100x or more slower than an equivalent C code. import numpy as np N = 10000 vect = np.arange(float(N)) vect[N/2] = 1 vect[N/4] = 1 dupl = [] print("init done") counter = 0 for i in range(N): for j in range(i+1, N): if
  • 如何用 C# 中的函数语句替换 for 循环?(How to replace for-loops with a functional statement in C#?)
    问题
  • 打开同一个目录两次(Open the same directory twice)
    问题 在命令行上,我可以打开一个目录,如: code . 现在,我想在另一个窗口中打开并显示两个相同的目录。 (这不是拆分编辑器) 然后,我又试了一次。 code . 什么都没有发生。 仍然打开了一个目录。 如何完成这样的任务? 回答1 您可以通过以下方式执行此操作: 1-手动打开一个新窗口( ctrl shift n )并转到: 文件 > 将文件夹添加到工作区。 然后只需选择文件夹。 2-打开命令面板( ctrl shift p )输入dupl并按回车键,这将在新窗口中复制当前工作区 * dupl只是完整命令的过滤器,即: Workspaces: Duplicate Workspace in New Window由于 dipnlink 注释, Workspaces: Duplicate Workspace in New Window 来源: https : //code.visualstudio.com/docs/editor/multi-root-workspaces *在 windows (10)、vscode (1.35.1) 中完成 回答2 在最新版本中,它实际上要简单得多。 在要复制的项目窗口中,打开命令面板(Mac 中为Command + Shift + P或 Ubuntu 中为Ctrl + Shift + P ),然后键入dupl (并选择Workspaces
  • 为什么要用Python进行功能编程?(Why program functionally in Python?)
    问题 在工作中,我们曾经以非常标准的OO方式对Python进行编程。 最近,有几个人加入了实用的潮流行列。 现在,他们的代码包含更多的lambda,map和reduce。 我了解功能语言对并发性很好,但是在功能上对Python进行编程真的对并发有所帮助吗? 我只是想了解如果我开始使用Python的更多功能,将会得到什么。 回答1 编辑:由于没有提供更多的解释/示例,我被注释中的任务(部分地,似乎是由FP的狂热者提供的,但不是唯一的),因此,扩大了答案以提供一些答案。 lambda ,更是让map (和filter ),最特别是reduce ,是几乎没有在Python中,这是一个强烈的多范式语言工作的工具。 与普通的def语句相比, lambda主要优势(?)是它使一个匿名函数产生,而def为该函数赋予了一个名称-并且,由于这种非常可疑的优势,您付出了巨大的代价(该函数的主体仅限于一个表达式,结果得到的函数对象不是可腌制的,名称的缺乏有时会使理解堆栈跟踪或以其他方式调试问题变得更加困难-我需要继续吗?!-)。 考虑一下您有时在“ Python”中看到的最愚蠢的惯用语(带有“吓人的引号”的Python,因为它显然不是惯用的Python-从惯用Scheme之类的音译中很糟糕,就像更频繁地过度使用) Python中的OOP是Java或类似语言的错误音译): inc = lambda x
  • 为什么我应该使用foreach而不是for(int i = 0; i(Why should I use foreach instead of for (int i=0; i<length; i++) in loops?)
    问题 似乎在C#和Java中循环的一种很酷的方法是使用foreach而不是C风格的循环。 为什么我会比C风格更喜欢这种风格? 我对这两种情况特别感兴趣,但是请根据您的需要解释您的观点。 我希望对列表中的每个项目执行操作。 我正在搜索列表中的某个项目,并希望在找到该项目时退出。 回答1 我能想到的两个主要原因是: 1)它从底层容器类型中抽象出来。 例如,这意味着您不必更改在更改容器时遍历容器中所有项目的代码,您可以指定“对容器中的每个项目执行此操作”的目标,不是手段。 2)消除了一对一错误的可能性。 就对列表中的每个项目执行操作而言,直白地说: for(Item item: lst) { op(item); } 与用迭代器手动完成操作相反,它完美地向读者表达了意图。 同上搜索项目。 回答2 想象一下,您是一家餐厅的主厨,并且您都在准备一份巨大的煎蛋饼作为自助餐。 您将一打十个鸡蛋的纸箱递给两个厨房员工,然后告诉他们要弄碎。 第一个设置一个碗,打开板条箱,依次从上到下从左到右抓取每个鸡蛋,然后在下一行抓鸡蛋,靠在碗的侧面,然后将其倒入碗中。 最终他用完了鸡蛋。 做得好。 第二个设置一个碗,打开板条箱,然后冲破以获得一张纸和一支笔。 他将数字0到11写在鸡蛋纸箱的隔间旁边,并将数字0写在纸上。 他看了看纸上的数字,找到标有0的隔间,取出鸡蛋并将其打碎入碗中。 他再次看纸上的0,认为“ 0
  • 如何找到算法的时间复杂度?(How to find time complexity of an algorithm?)
    问题
  • 为什么OpenMP不允许!=运算符?(Why is the != operator not allowed with OpenMP?)
    问题 我正在尝试编译以下代码: #pragma omp parallel shared (j) { #pragma omp for schedule(dynamic) for(i = 0; i != j; i++) { // do something } } 但我收到以下错误:错误:控制谓词无效。 OpenMP标准规定,对于parallel for构造它“唯一”允许以下操作符之一: < , <= > >= 。 我不理解不允许i != j的理由。 对于static schedule ,我可以理解,因为编译器需要预先计算分配给每个线程的迭代次数。 但是我不明白为什么在这种情况下会出现这种限制。 有什么线索吗? 编辑:即使我做for(i = 0; i != 100; i++) ,尽管我可以只输入“ <”或“ <=”。 回答1 。 我向OpenMP开发人员发送了有关此主题的电子邮件,得到的答案是: 对于有符号的int,环绕行为是不确定的。 如果我们允许!= ,则程序员可能会获得意外的行程计数。 问题在于编译器是否可以生成代码来计算循环的行程数。 对于一个简单的循环,例如: for( i = 0; i < n; ++i ) 如果n> = 0 ,则编译器可以确定存在“ n”次迭代;如果n <0 ,则编译器可以确定为零次迭代。 对于像这样的循环: for( i = 0; i != n; ++i
  • 用SPARKS语言写算法
    实际上,任何一种接近高级程序设计语言的描述语言都可以用来表达算法过程,例如,20世纪50年代欧美计算机学家合力创造的ALGOL语言,以及六十年代末瑞士Niklaus Wirth创造的PASCAL语言。《计算机算法基础》(余祥宣、崔国华、邹海明,华中科技大学出版社)书中采用的是SPARKS语言。 SPARKS 语言是一种算法描述语言,这种语言具有精简易懂的特点,适用于模块化程序设计过程中对于各模块的算法进行描述交流,通过使用SPARKS 语言,在模块细化的过程中,可以忽略模块的细节而将关键的算法思想表达出来。百度百科链接 由于考研复习的原因,这本书作为推荐书,虽然出版时间有点远了,但还是翻出来借鉴一番。也趁机系统的学习一门算法描述语言,作为以后算法表达的规范之一(比如西瓜书里表达机器学习算法的“语法”)。另一方面,也是搭建这种简化的语言体系,有助于自己往后设计DSL。 SPARKS语言基本语法 基本数据类型 1.整型 integer x, y 2.实型 float d 3.布尔型 boolean a, b 有两个布尔值,true和false。为了产生这两个布尔值,设置了逻辑运算符,and、or、not和关系运算符< ≤ = ≠ ≥ >。 4.字符型 char c, d 关键字和变量命名 在SPARKS中,有特殊含义的标识符将作为保留字来考虑,用黑体字表示,给变量的命名规则是
  • 列表 <> 上的 Select 和 ForEach [重复](Select and ForEach on List<> [duplicate])
    问题 这个问题在这里已经有了答案: LINQ 相当于 foreach 的 IEnumerable<T> (22 个答案) 8年前关闭。 我对 C# 很陌生,并试图使用 lambda 表达式。 我有一个对象列表。 我想从列表中选择项目并对所选项目执行 foreach 操作。 我知道我可以在不使用 lambda 表达式的情况下做到这一点,但我想如果使用 lambda 表达式可以做到这一点。 所以我试图达到类似的结果 List<UserProfile> users = new List<UserProfile>(); ..load users with list of users List<UserProfile> selecteditem = users.Where(i => i.UserName=="").ToList(); foreach(UserProfile item in selecteditem) { item.UserName = "NA"; } 有可能做 users.Where(i => i.UserName=="").ToList().ForEach(i=>i.UserName="NA"); 但不是这样的 users.select(i => i.UserName=="").ForEach(i=>i.UserName="NA"); 有人可以解释这种行为.. 回答1
  • c语言入门总结(基础1)
    一、最简单的C语言实例: #include<stdio.h> int main() { /在双引号中间输入Hello World/ printf(“Hello World”); return 0; } 注:在最新的C标准中,main函数前的类型为int而不是void 二、C语言的具体结构 简单来说,一个C程序就是由若干头文件和函数组成。 ①、#include <stdio.h>就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。 ②、函数就是实现代码逻辑的一个小的单元。 三、必不可少之主函数 一个C程序有且只有一个主函数,即main函数。 ①、C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口。 ②、 而main前面的int就是主函数的类型. ③、printf()是格式输出函数,这里就记住它的功能就是在屏幕上输出指定的信息 ④、return是函数的返回值,根据函数类型的不同,返回的值也是不同的。 ⑤、\n是转义字符中的换行符。(注意:C程序一定是从主函数开始执行的) 四、良好习惯之规范 ①、 一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行。 ②、函数体内的语句要有明显缩进,通常以按一下Tab键为一个缩进。 ③、括号要成对写,如果需要删除的话也要成对删除。 ④、
  • 为什么相同的 LINQ 表达式在两个不同的 foreach 循环中表现不同?(Why the same LINQ expression behaves differently in two different foreach loops?)
    问题