类中的递归函数

时间:2018-03-03 14:04:09

标签: dart

以下代码对我来说很好,虽然它是一个单独的功能

chunkBySize(List list, int size) => list.isEmpty
    ? list
    : ([list.take(size)]..addAll(chunkBySize(list.skip(size), size)));

我能够顺利地称之为:

void main() {
  var list = new List();
  list.addAll([1,2,3]);
  print(chunkBySize(list, 2));
}

但是当我试图在一个结构中使用它时,它失败了,所以我不得不写下面的方式:

import 'dart:collection';

class functionalList<E> extends ListBase<E> {
  final List<E> l = [];  // or List l = new List();
  functionalList();
  .
  .
  .
  chunkBySize(int size) => _chunkBySize(l, size);

  _chunkBySize(List list, int size) => list.isEmpty
      ? list
      : ([list.take(size)]..addAll(_chunkBySize(list.skip(size), size)));
}

并且能够通过以下方式调用它:

void main() {
  var list = new functionalList();
  list.addAll([1,2,3]);
  print(list.chunkBySize(2));
}

有没有办法在班级男孩中简化它,即用单一陈述替换下面的内容:

  chunkBySize(int size) => _chunkBySize(l, size);

  _chunkBySize(List list, int size) => list.isEmpty
      ? list
      : ([list.take(size)]..addAll(_chunkBySize(list.skip(size), size)));

1 个答案:

答案 0 :(得分:0)

您可以在chunkBySize方法中声明本地帮助程序函数。

class FunctionalList<E> extends ListBase<E> {
  ...
  List<Iterable<E>> chunkBySize(int size) {
    List<Iterable<E>> helper(Iterable<E> list, int size) => list.isEmpty 
        ? const [] 
        : ([list.take(size)]..addAll(_chunkBySize(list.skip(size), size);
    return helper(this, size);
  }
}

我没有发现这比具有外部帮助功能更具可读性,但在这种情况下,它实际上为您提供了更好的输入。

我可能会把这个函数写成:

List<Iterable<E>> chunkBySize(int size) {
  List<Iterable<E>> result = [];
  for (int i = 0; i < this.length; i += size) {
    result.add(this.getRange(i, min(i + size, this.length)));
  }
  return result;
}

既易于阅读又更有效率。

重复callas addAll的递归函数将具有原始列表长度的二次方的时间复杂度,因为它不断将元素从一个列表复制到另一个列表。