在List.map中使用递归调用

时间:2012-09-23 13:56:59

标签: scala recursion

我在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;
        }
    }

1 个答案:

答案 0 :(得分:2)

检查List.range的文档:

  

值为start, start + 1, ..., end - 1

的$ coll

附加说明:

  • 在您的情况下,尾部调用优化不可用。
  • .foldLeft(0)((b, a) => b + a)等于.sum
  • 您将命令式循环解决方案与递归混合,尝试仅使用递归列表 处理