2016-02-04 22 views
1

如何編寫一個函數,它構建給定長度的列表。以scala編寫遞歸列表的挑戰

def buildList[A](length: Int, f: Int => A): List[A] 

測試的情況將是這樣的::

test("test") { 
def f(x: Int) = x 
assert(buildList(10, f) == List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) 

所以輸入例子是listBuild(10,F)=輸出的每個元件通過將f應用到該元素的索引來確定列表(0,... 9)

我知道如何在OOL中做到這一點,但功能性編程對我來說是一個有點新的概念。

有關如何完成此任何想法?至少,僞代碼將有所幫助..

PS:這不是硬件。我一直在試圖自學斯卡拉,這是我一直在努力的功能...

+1

'我一直在努力自學階,這是我一直在努力的功能......' 繼續前進 - 我記得學習摺疊2年前我的頭靠在牆上 –

+1

「這不是硬件。」如果你這麼說,但奇怪的是,(至少)你有兩個人今天就同一個函數問了一些問題:http://stackoverflow.com/questions/35204312/error-in-recursive-list-logic –

+1

'List。表格(長度)(f)'正是你想要的。但我理解的重點是自己寫下 –

回答

0
  1. k是一個整數,並且永遠不會匹配空列表無。
  2. 這裏是您的功能,使用 「buildLister」

    DEF listBuilder [A](K:中等,F:INT => A):列表[A] = 如果(K < 0)無 別的f(k):: listBuilder(k-1,f)

    def buildLister [A](k:Int,f:Int => A):List [A] = listBuilder(k-1,f) .reverse

+0

有幫助。我重新編輯問題。也許它更清楚一點... –

+0

你有'buildLister'和'listBuilder'。一個是錯誤! –

+0

@TheArchetypalPaul錯字糾正 –

0
scala> def buildHelper(x: Int): List[Int] = 
    | if (x < 0) List() else x :: buildHelper(x-1) 
buildHelper: (x: Int)List[Int] 

scala> def buildList(x: Int): List[Int] = 
    | ??? 
buildList: (x: Int)List[Int] 

Implemen塔季翁爲buildList(滾動過它來查看它 - 但我會嘗試先執行它你自己):

buildHelper(x)的.reverse

scala> buildList(10) 
res2: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
+0

這不使用函數'f'。 –

2

這裏最好不要使用遞歸。您可以使用Range獲得包含索引的序列。對集合的每個元素應用函數稱爲地圖。結合這兩個給你:

0 until length map f 
+0

''''''''''''''''''''''''''最好不要在這裏使用遞歸。「''''''''''''''解釋爲什麼不應該明確地使用」遞歸「。 –

+0

這是一個可讀性和慣用功能編程風格的問題。遞歸只在其他方法不可行或者不太清楚的情況下使用。 –

+0

當然,卡爾。在我看來,在有人學習函數式編程的基礎知識的情況下,直接跳到更高階的函數(比如'直到')是沒有用的。我認爲,最好實施一個非尾遞歸解決方案。然後,編寫尾遞歸解決方案,然後使用'fold'。最後,儘可能地跳過'fold' - 只使用高階函數,比如'filter','sum'等。' –

0

建設Scala中的一個列表遞歸

你可以嘗試這樣的事情:

object UtilList { 

    def build[A](length: Int, f: Int => A): List[A] = { 
    val list: List[A]= List() 

    @annotation.tailrec 
    def foo(list: List[A], index: Int, f: Int => A): List[A] = { 
     if (index == length) list 
     else foo(f(index) :: list, index + 1, f) 
    } 
    foo(list, 0, f) 
    } 
}