Haskell多重递归,相互递归(合并排序Merge Sort)

博客介绍了Haskell中的多重递归和相互递归,以even和odd函数为例说明多重递归。还阐述了合并排序和快速排序算法,前者将列表分半排序后合并,后者通过划分、征服步骤排序。此外,提到递归虽强大但有局限,函数式编程中有时有更优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Haskell多重递归,相互递归(合并排序Merge Sort)

多重递归Multiple recursion
本质上,当您在函数体中多次调用函数本身时,就会发生多次递归。
例子:
even :: Int -> Bool
even 0 = True
even n = odd (n-1)
odd :: Int -> Bool
odd 0 = False
odd n = even (n-1)

相互递归Mutual recursion
真的没什么特别的,只需要考虑n个基本情况和n(其中n是相互递归的程度)

优雅的排序
函数式编程(连同排序)可以为许多问题带来优雅的解决方案。
在 Java/C/Python/etc 中可能需要 10 行代码的事情通常可以在 Haskell 中用几行简洁易懂的行来表达。

合并排序Merge Sort
基本算法:将列表分成两半,对每一半进行排序,将两个排序列表合并在一起
在这里插入图片描述
将列表分成两半
在这里插入图片描述
将两个排序列表合并在一起
在这里插入图片描述
快速排序:提醒
划分:
选择一些称为枢轴(pivot)的元素。将其移动到排序序列中的最终位置,使所有较小的元素都在其左侧,较大的元素在其右侧。
征服:
对较小和较大元素的子数组进行递归排序
结合:
这里不需要做任何工作——在递归之后对数组进行排序。
在这里插入图片描述

一个不同的例子
我们查看了一个示例,在该示例中,字符串中的一个字符被另一个字符替换。更有用的是一个函数,其中一个子字符串被另一个子字符串替换。
在这里插入图片描述
生成一个质数列表
从 2 生成所有数字的列表,测试每个数字,看看它是否是质数
如果不是,请扔掉它;如果有,请保留
在这里插入图片描述
或者…
在这里插入图片描述
那么递归是一切的答案吗?不
这是一个非常强大的工具。但有时存在基于库函数的更优雅(和更有效)的解决方案
递归本质上是低效的,但有时在函数式编程中不可避免
函数式编程编译器非常复杂,编程语言中更高级别的抽象意味着编译器会做更多的工作,有一些技术允许编译器删除递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值