如何编写一个函数,它构建给定长度的列表。通过将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。我一直在努力教自己斯卡拉,这是我一直在努力的一个功能......
答案 0 :(得分:2)
最好不要在这里使用递归。您可以使用Range获取包含索引的序列。将函数应用于集合的每个元素称为 map 。将两者结合起来可以得到:
0 until length map f
答案 1 :(得分:0)
这是你的功能,使用" 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)
}
}