2014-06-21 17 views
2

Haskel的這個功能是做什麼的?這個函數在Haskell中做了什麼?

我不明白遞歸在這裏工作

f[]=[] 
f(x:xs)=x: [y|y <- f xs, x/=y] 
+0

你有沒有試過運行它?遞歸的特殊性你不瞭解嗎? –

回答

6
f[]=[] 
f(x:xs) = x : [y|y <- f xs, x/=y] 

該函數從列表中刪除重複項。以下是它的工作方式:

  • 基本情況下,列表爲空,所以它返回空列表。
  • 否則你採取第一個元素x,並假設(歸納假設)f xs給你沒有重複的列表。現在,你唯一要做的就是確保你不要再插入x。因此,列表擴展意味着:將其餘所有元素(通過歸納假設都是唯一的)取出,但刪除x

現在感覺嗎?

ps。你可以寫第二個子句也是這樣的: f(x:xs) = x : filter (/= x) (f xs)

+0

非常清楚...... – Ohad

+0

你可以重寫整個定義爲:'f = foldr(\ x - >(x :)。filter(/ = x))[] ' – user3237465

1

在我看來,它消除列表中的任何重複條目的方式。

下面是它如何工作的:

f[] = []意味着,當輸入一個空表,輸出將是一個空列表。
然後,f(x:xs) = x: [y|y <- f xs, x/=y]使用所謂的列表理解。它需要輸入列表的頭部,然後附加列表理解。

列表內涵讀這樣的:「Y這樣y是F(XS),和y並不等於X」

所以它在f個元素不(XS)的列表等於頭元素。

+0

我運行f [1,2,3,4,12,3,1,2,1,4],我得到沒有重複的列表...但我沒有得到它的工作方式.. – Ohad

+0

否,你不能;那隻會讓你看到第一個元素不重複的元素列表。所以,f([1,1,2,2])會返回[1,2,2]。 – Santiclause

+0

我現在明白了..謝謝你 – Ohad