我们说我们有以下列表:
'( (1 2 3) (3 4 5) (7 8 9) (2 9 9) )
我需要创建一个列表,其中包含子列表中包含给定值的所有索引,例如:对于 2 ,结果将为'(0 3)
。这是一项家庭作业,我们不允许使用循环。使用递归解决这个问题很简单,但我想使用函数但我不知道是否可能(不使用全局变量,设置!和任何其他横向功能)。欢迎任何提示/建议!
答案 0 :(得分:0)
是的,你肯定可以用foldl解决这个问题。 Foldl可用于模拟列表的任何循环遍历。
老实说,理解如何将foldl用于这样的问题的最清楚的方法是首先在design recipe之后以简单的递归方式编写它。您应该小心只在递归调用中使用列表的rest
。
接下来,您需要重构程序,以便它只进行尾调用;也就是说,如果你要定义一个名为f
的函数,那么“cons”的情况应该是(f ...)
,没有任何“外部”。为了使这成为可能,你可以为你的函数引入一个额外的参数,通常称为“累加器”。空案例中的函数结果应该只是累加器。此时,更改为foldl
的使用只是使用列表,累加器的初始值以及获取列表的第一个元素和累加器的函数调用foldl
的问题。并生成新的累加器。
呼!