假设我们有以下列表:
'( (1 2 3) (3 4 5) (7 8 9) (2 9 9) )我需要从包含给定值的子列表中创建一个包含所有索引的列表,例如对于2,结果将是'(0 3) .It是一项家庭作业,我们不允许使用循环。使用递归来解决这个问题很简单,但我想使用泛函,但我不知道这是否可能(不使用全局变量、set!和其他任何横向函数)。欢迎任何提示或建议!
发布于 2017-03-19 23:12:03
是的,你绝对可以用折页来解决这个问题。Foldl可用于建模列表的任何类似循环的遍历。
老实说,理解如何在这样的问题上使用foldl的最清晰的方法是首先按照设计配方的简单递归方式编写它。您应该小心地只在递归调用中使用列表的rest。
接下来,您需要重构程序,使其只进行尾调用;也就是说,如果要定义一个名为f的函数,则“(f ...)”大小写应该是(f ...),其中没有“外部”的任何内容。为了实现这一点,您可以为函数引入一个额外的参数,通常称为“累加器”。空情况下函数的结果可能只是累加器。此时,更改为foldl的使用只是一个用列表调用foldl的问题,累加器的初始值,以及接受列表和累加器的第一个元素并生成新累加器的函数。
呼!
https://stackoverflow.com/questions/42892886
复制相似问题