我刚从Haskell开始,所以我试着用"Haskell思维方式“来思考。是否有理由使用模式匹配来解决问题1 这里基本上是通过展开整个列表并递归调用函数来解决问题1,而不是像myLast lst = lst !! ((length lst) - 1)那样直接检索最后一个元素?它看起来几乎是蛮力,但我想这只是我对这里不熟悉。
发布于 2018-10-07 02:59:27
有几件事我能想到:
(!!)和length最终是使用对列表结构的递归实现的。既然如此,使用显式递归实现这些基本函数可能是一个值得学习的练习。length必须遍历列表的所有元素,而(!!)必须遍历所有元素,直至达到所需的索引。既然如此,lst !! (length lst - 1)会在整个列表中运行两次,而不是一次。(这是为什么作为经验规则,最好避免使用length,除非您实际上需要知道元素的数量,而不仅仅是作为其他元素的代理。)[x]模式(或等效地匹配x : [] --一个与空列表相对应的元素),则您知道x是最后一个元素。在某种程度上,匹配[x]比在索引length lst - 1访问list元素少一个间接级别,因为它只处理列表的结构,而不需要将索引方案栓在其顶部。尽管如此,从根本上说,你的感觉是正确的,即明显的递归感觉“几乎是野蛮的力量”。随着时间的推移,您将了解折叠、映射函数以及其他捕获和抽象常见递归模式的方法,从而能够以更流畅的方式编写。
https://stackoverflow.com/questions/52684964
复制相似问题