首页 > 解决方案 > 返回一个包含 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-numericfunction-no-numeric返回一个列表,我需要创建一个列表,这些列表由这些函数返回。但我不知道该怎么做。

也许使用地图会更容易,但我不这样做。

如何使用我的 for 循环返回列表列表?

标签: functional-programmingracket

解决方案


对于初学者来说,使用索引是遍历列表的最糟糕的方法,应该避免:每个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 vectorinstead,它针对使用索引的快速项目检索进行了优化。


推荐阅读