我是一名来自python / java的新手程序员,他试图掌握scala中的函数式编程。 我正在尝试编写一个函数,该函数将接受字符列表并返回其频率列表。例如,List('a','b','a')应该返回List(('a',2),('b',1))。 我是scala和tail递归的新手,所以请不要以为是先验知识:)这就是我的经验:
def times(chars: List[Char]): List[(Char, Int)] = {
def loop(chars: List[Char], list: List[(Char, Int)]): List[(Char, Int)] =
{
if (chars.isEmpty) list
else
{
val head = chars.head
val freq = chars.count(x=> x == head)
(head,freq) :: list
loop(chars.tail.filterNot(x=> x == head),list)
}
}
loop(chars,List())
}
如果我运行次(List('a','b','a')),我只会得到一个空列表。任何帮助将不胜感激!
答案 0 :(得分:1)
List
是不可变的,因此
(head, freq) :: list
在列表的前面创建一个List
的新(head, freq)
(因为List
是不可变的,但是将新列表的尾部作为与该对象相同的对象是安全的list
)。由于您没有将新列表分配给任何内容,因此该行也可能不会发生。
类似的东西:
val nextList = (head, freq) :: list
loop(chars.tail.filterNot(x => x == head), nextList)
将导致该列表在loop
中建立。
答案 1 :(得分:0)
虽然接受的答案足以回答问题;一些额外的学习方法: 在处理列表项时,您可以/应该利用以下模式匹配
def loop(chars:List[Char], list:List[(Char,Int)]):List:[(Char,Int)]= chars match{
case head::tail => val freq = chars.count(x=> x == head)
loop(tail.filterNot(x=> x == head), (head, freq)::list)
case Nil => list
}