首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释递归Haskell列表函数是如何工作的?

解释递归Haskell列表函数是如何工作的?
EN

Stack Overflow用户
提问于 2011-06-12 23:55:24
回答 2查看 5.5K关注 0票数 0

我知道下面的函数是做什么的,我只想解释一下它是如何工作的,以及发生的计算:

代码语言:javascript
复制
sponge :: Int -> [a] -> [a]
sponge 0 xs = xs
sponge n [] = []
sponge n (x:xs) = sponge (n-1) xs

我现在似乎已经失去了所有的情节:

如果能帮助我重回正轨,我将不胜感激!:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-13 00:05:30

这是一个关于两个变量的递归函数。您可以逐行拆分它来理解它:

代码语言:javascript
复制
sponge :: Int -> [a] -> [a]

两个参数,一个是Int,一个是一些元素的列表。

代码语言:javascript
复制
sponge 0 xs = xs

基本情况。如果Int参数为零,则返回未修改的列表参数。

代码语言:javascript
复制
sponge n [] = []    

另一种基本情况是,如果列表为空,则立即返回空列表。

代码语言:javascript
复制
sponge n (x:xs) = sponge (n-1) xs

最后,归纳步骤。如果列表是非空的(即至少由一个元素和一个尾部组成,用x:xs表示),那么结果是在n-1和列表的尾部调用sponge

那么这个函数会做什么呢?在删除n元素后,它将返回列表的尾部。与drop函数相同:

代码语言:javascript
复制
> drop 10 [1..20]
[11,12,13,14,15,16,17,18,19,20]

代码语言:javascript
复制
> sponge 10 [1..20]
[11,12,13,14,15,16,17,18,19,20]

事实上,我们可以要求QuickCheck确认:

代码语言:javascript
复制
> quickCheck $ \n xs -> sponge n xs == drop n xs
*** Failed! Falsifiable (after 7 tests and 5 shrinks):    
-1
[()]

阿!他们不一样。当n为负数时!因此我们可以修改与这两个函数相关的属性:

代码语言:javascript
复制
> quickCheck $ \n xs -> n >= 0 ==> sponge n xs == drop n xs
+++ OK, passed 100 tests.

因此,对于n为正的情况,您的函数的行为类似于drop。

下面是通过hood debugger获取的nxs中间值的跟踪

票数 17
EN

Stack Overflow用户

发布于 2011-06-13 00:03:45

它有两个参数,如您所见:一个Int和一个list。它进行模式匹配以区分三种情况: 1) Int为零;2)列表为空;或3) Int不为零,列表也不为空。

在第一种情况下,它返回列表;在第二种情况下,它返回空列表(这就是第二个参数);在第三种情况下,它递归地使用原始Int参数减1和原始列表减去第一个元素来调用自己。

它看起来很像前奏曲中的"drop“。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6322921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档