Haskell --- 递归函数思想

版权声明:学习交流为主,未经博主同意禁止转载,禁止用于商用。 https://blog.csdn.net/u012965373/article/details/82951644

我们已经递不少归了,也许你已经发觉了其中的固定模式:先定义一个边界条件,再定义个函数,让它从一堆元素中取一个并做点事情后,把余下的元素重新交给这个函数。 这一模式对List、Tree等数据结构都是适用的。例如,sum函数就是一个List头部与其尾部的sum的和。一个List的积便是该List的头与其尾部的积相乘的积,一个List的长度就是1与其尾部长度的和. 等等

再者就是边界条件。一般而言,边界条件就是为避免程序出错而设置的保护措施,处理List时的边界条件大部分都是空List,而处理Tree时的边界条件就是没有子元素的节点。

处理数字时也与之相似。函数一般都得接受一个值并修改它。早些时候我们编写过一个计算斐波纳契的函数,它便是某数与它减一的斐波纳契数的积。让它乘以零就不行了, 斐波纳契数又都是非负数,边界条件便可以定为1,即乘法的单位元。 因为任何数乘以1的结果还是这个数。而在sum中,加法的单位元就是0。在快速排序中,边界条件和单位元都是空List,因为任一List与空List相加的结果依然是原List。

使用递归来解决问题时应当先考虑递归会在什么样的条件下不可用, 然后再找出它的边界条件和单位元, 考虑参数应该在何时切开(如对List使用模式匹配), 以及在何处执行递归.


 

猜你喜欢

转载自blog.csdn.net/u012965373/article/details/82951644