我在Scala中遇到列表操作问题。我正在尝试实现相同的逻辑,我已经在Java中按顺序实现(并且它有效)但它返回0,这是我没想到的。我尽可能地调试了列表操作(替换了提供的列表序列的映射调用,其行为符合预期),但我无法追踪最后一步(将列表成员映射到此函数的递归调用)。你能提供一些关于我的方法的想法吗?
@tailrec
def a(b: Int, cList: List[Int]): Int = {
if (b == 0) 1
else if (cList.isEmpty) 0
else
List.range(0, b / cList.head).
map(n => a(b - n * cList.head, cList.tail)).
foldLeft(0)((b, a) => b + a)
}
我想,在foldLeft
之前,列表必须包含对所有元素的递归调用的结果。这样的电话有效吗?为了清楚起见,我附上了我的Java程序,其行为与假设一样:
private static int a(int b, int[] cList) {
if (b == 0) {
return 1;
} else {
if (cList.length == 0)
return 0;
int head = cList[0];
int[] tail = Arrays.copyOfRange(cList, 1, cList.length);
int x = b / head;
int sum = 0;
for (int i = 0; i <= x; i++) {
sum += a(b - (i * head), tail);
}
return sum;
}
}
答案 0 :(得分:2)
检查List.range的文档:
值为
的$ collstart, start + 1, ..., end - 1
附加说明:
.foldLeft(0)((b, a) => b + a)
等于.sum