Ars*_*oni 6 recursion haskell functional-programming mutual-recursion
我最近开始学习Haskell.
我在网上找到了这个代码,它返回列表所有偶数/奇数位置的元素.
它利用了相互递归,但我似乎无法理解它是如何在内部工作的.
evens (x:xs) = x:odds xs
evens _ = []
odds (_:xs) = evens xs
odds _ = []
Run Code Online (Sandbox Code Playgroud)
特别是,我不明白该清单如何向前推进并评估所有要素.即使没有明确的索引检查,它如何检查偶数位置
有人能够提供洞察力吗?
首先,让我们就某事达成一致:我们大多数时候都使用0指数,对吧?所以,如果我问你列表中第2位的元素是什么
a : b : c : d : []
Run Code Online (Sandbox Code Playgroud)
你会回答c.编辑:如果您不熟悉Haskell表示法,:则是列表构造函数,并a : b表示通过a在列表前添加前缀而生成的列表b.
继续前进到元素在偶数位置,a并且c将是显而易见的答案,而b和d将是奇怪的位置.让我们来看看它的定义even.
evens (x:xs) = x:odds xs
evens [] = []
Run Code Online (Sandbox Code Playgroud)
基本情况很简单:空列表中的偶数位置没有元素
归纳案例说明位置0(x)中的元素处于偶数位置 - 它是 - 并且它还表示列表(x:xs)中偶数位置的所有其他元素都位于列表中的奇数位置xs.实际上,列表中位置2中的元素位于列表(x:xs)中的位置1中xs,位置4中位于位置3中的元素,依此类推;等等; 那有意义吗?
使用相同的推理,列表中奇数位置的(x:xs)元素是列表中偶数位置的元素xs,这正是odds上面的定义.
| 归档时间: |
|
| 查看次数: |
2224 次 |
| 最近记录: |