functional-programming - 返回一个包含 for 循环执行结果的列表
问题描述
我刚刚开始学习球拍,我需要用索引循环一个列表。
现在,我正在使用:
#lang racket
(for ([index (in-range 0 (length list1))])
(if (number? (list-ref list1 index))
(function-numeric list1 index list2)
(function-no-numeric list1 index list3)))
function-numeric
并function-no-numeric
返回一个列表,我需要创建一个列表,这些列表由这些函数返回。但我不知道该怎么做。
也许使用地图会更容易,但我不这样做。
如何使用我的 for 循环返回列表列表?
解决方案
对于初学者来说,使用索引是遍历列表的最糟糕的方法,应该避免:每个list-ref
操作都是O(n)
,因为要到达元素i
,您必须遍历i-1
它之前的所有元素,从而使整个遍历成为一个巨大的O(n^2)
操作。如果您绝对需要它们,则使用索引生成一个单独的列表。
为了将返回的数据收集到一个列表中,我们可以利用它for/list
来累积每次迭代的结果,甚至可以并行遍历多个元素序列。让我们把所有的放在一起:
(for/list ([element list1]
[index (in-range (length list1))])
(if (number? element)
(function-numeric list1 index list2)
(function-no-numeric list1 index list3)))
我只是希望你不要在里面list-ref
再次function-numeric
使用and function-no-numeric
。也许有更好的方法来构建你的算法,完全避免索引 - 不应该像我们使用数组一样使用列表!如果您的算法无法修改以避免索引,那么请考虑使用 a vector
instead,它针对使用索引的快速项目检索进行了优化。
推荐阅读
- r - 将按键字符转换为R中的整数
- python-3.x - 比较 2 个包含不同键的字典列表,如果找到匹配则更新
- qt - 我是否遗漏了什么或者这是创建自定义控件/组件的方式
- python - 如何使用 OpenCV-Python 更改某个区域的色调
- asp.net-mvc - Asp.net Core OpenIdConnect (OIDC) 在哪里验证状态参数
- javascript - 缩小后适合 X 轴和 scaleXY 以保持画布居中
- c# - 使用动态数量的元素寻址 JObject
- android - 华为在应用内购买的版本与从安卓购买的普通应用内是否相同
- api - Flutter DIO:使用带有 Dio 包的二进制体上传图像
- algorithm - 当边在 dijkstra 算法中具有相同的权重时,下一个顶点是什么?