我只是从Haskell入手,所以我想将自己的想法围绕“ Haskell的思维方式”。是否有理由使用模式匹配来解决问题1 here,基本上是通过展开整个列表并递归调用函数,而不是像myLast lst = lst !! ((length lst) - 1)
那样直接检索最后一个元素来解决问题1?似乎几乎是蛮力的,但我认为这只是我在这里不熟悉。
答案 0 :(得分:9)
我能想到的几件事:
和
(!!)
最终是通过对列表结构进行递归来实现的。这样,使用显式递归实现那些基本功能可能是一个值得学习的练习。
请记住,在幕后,最后一个元素的检索不是直接的。由于我们正在处理链接列表,因此length
必须遍历列表的所有元素,而length
必须遍历所有元素直至所需的索引。这样,(!!)
在整个列表中运行两次,而不是一次。 (这是为什么最好避免使用lst !! (length lst - 1)
的原因之一,除非您实际上需要知道元素本身的数量,而不仅仅是了解其他元素。)< / p>
模式匹配是陈述有关数据类型结构事实的一种巧妙方法。如果在递归使用列表的同时匹配length
模式(或等效地,[x]
-被限制为空列表的元素),则您知道x : []
是最后一个元素。在某种程度上,匹配x
所涉及的间接级别比访问索引[x]
处的列表元素少,因为它只处理列表的结构,而无需在索引上附加索引方案。
说了这么多,从根本上来说,您的感觉是明确的递归感到“几乎是蛮力”。随着时间的推移,您会发现有关折叠,映射功能以及其他捕获和抽象通用递归模式的方法,从而可以更流畅地进行书写。