以递归方式在scala中构建列表的挑战

时间:2016-02-04 21:15:03

标签: scala recursion functional-programming

如何编写一个函数,它构建给定长度的列表。通过将f应用于元素的索引来确定每个元素:

function stringrev(str) {
  var newString = "";

  for (var i = str.length - 1; i >= 0; i--) {
    // add each character to newString
    newString = newString + str.charAt(i);
  }
  if (newString.charAt(newString.length - 1) === newString.charAt(newString.length - 1).toUpperCase()) {
    return newString.slice(0, newString.length - 1) + newString.charAt(newString.length - 1).toLowerCase();
  }

  return newString;
}

测试用例将是这样的:

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

所以输入示例是listBuild(10,f)=输出List(0,.... 9)

我知道如何在OOL中做到这一点但功能性编程对我来说是一个有点新概念。

关于如何实现这一目标的任何想法?至少,伪代码会有所帮助..

PS:这不是HW。我一直在努力教自己斯卡拉,这是我一直在努力的一个功能......

4 个答案:

答案 0 :(得分:2)

最好不要在这里使用递归。您可以使用Range获取包含索引的序列。将函数应用于集合的每个元素称为 map 。将两者结合起来可以得到:

0 until length map f

答案 1 :(得分:0)

  1. k是一个整数,永远不会与空列表Nil匹配。
  2. 这是你的功能,使用" buildLister"

    def listBuilder [A](k:Int,f:Int =&gt; A):List [A] =    如果(k <0)为零    else f(k):: listBuilder(k-1,f)

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

答案 2 :(得分: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]

buildList的实施(滚动查看它 - 但我首先尝试自己实施):

  

buildHelper(x).reverse

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

答案 3 :(得分: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)
  }
}