Pro*_*ool 5 recursion scheme racket
在过去的几个月里,我一直在使用F#到Haskell和Scheme(Racket)的功能语言.我从来没有真正使用过递归,但Haskell及其模式匹配确实帮助我减少了对它们的恐惧.现在我正在使用Scheme,我似乎默认使用递归方法.我很好奇这是否表明只是经历了"o闪亮!" 阶段或如果递归是Scheme开发的主要内容.
旁注:每当我编写递归方法时,我一直在为尾递归拍摄.
Gre*_*ott 10
我认为这取决于你所说的是什么类型的递归.
第一个大开眼界(例如,如果你正在通过SICP工作)是迭代可以被递归取代.你在过去的生活中写过的所有那些乏味且容易出错的循环代码都可以用另一种方式完成.这是一个很酷的(如你所说)"哦,有光泽!" 经验.
下一个大开眼界的是多么少的是那种递归代码,你会真正在现实生活中写.相反,你将通过使用像和的构建块来避免繁琐的迭代 - 以及繁琐的递归.mapfold
此外,在拍你可能会从大学毕业map,并fold以更喜欢"内涵"之类for/list,for/vector和for/fold上序列的工作不只是列出.你继续沿着食物链走.
话虽如此,有一些问题你最好以递归方式解决(不只是"通过其他方式迭代").我认为,你大开眼界的舒适程度将有助于那里.
不,这不是一个阶段,它是一个主食.递归是一种技术,它允许您解决比您能够轻松解决的更复杂的问题 - 即使在您需要迭代解决方案的情况下,如果您首先制定递归解决方案,也更容易实现.
掌握递归也为您开辟了新的问题领域.典型的仅迭代程序员不具备处理问题的能力,例如,涉及在形式语言之间进行操作和翻译,例如,基于用户想要看到的报告的编码描述来编写复杂的SQL查询生成器.
如果你想继续前进,你应该考虑使用折叠更加舒适,它通过将计算的递归结构与递归步骤的内容分开来抽象而不是显式递归.因此,例如,Scheme fold-right可以被视为"执行与此列表具有相同形状的递归计算,将空列表映射为此值作为基本情况,并且每个都映射cons到此函数." 然后是其他更复杂的数据结构的折叠.