繁体   English   中英

如果 dart 中有 [1::]?

[英]if there is [1::] in dart?

在 python 中,我们可以编写递归 function 来计算列表中的元素,如下所示:

def count(list):
if list == []:
return 0

return 1 + count(list[1::])

但是如果有方法或其他东西可以在 Dart 中创建这行代码 return 1 + count(list[1::]) ?

我认为,我们可以使用 dart collections 来做这样的事情

var result = (1 + a.sum);
return result;

现在我尝试像这样解决这个任务:

void main() {
  List<int> n = [2, 6, 7]; //the arrays of element

  int sumsReccur(List<int> n) {
    if (n.length <= 0) {
      return 0; //base case
    }
  }

  var result = 1 + sumsReccur(n.length);

  return result;
}

Dart 具有惰性迭代器,这更有可能是您想要的。 执行iterable[1::]的方法是iterable.skip(1)

它仍然非常低效,但你可以这样做:

  int count(Iterable values) {
    if (values.isEmpty) return 0;
    return 1 + count(values.skip(1));
  }

计算values的元素数量仍然需要 O(n^2) 时间,但由于它很懒,它也不会复制元素,所以它只进行 O(n) memory 分配。

在实践中,如果您关心性能,则永远不要这样做。 最好在迭代器上进行迭代

int count(Iterable values) {
  int countIterator(Iterator iterator) {
    if (iterator.moveNext()) return 1 + countIterator(iterator);
    return 0;
  }
  return countIterator(values.iterator);
}

同样,这里的递归是微不足道的,并且在迭代器上递归通常是一个坏主意(最好有一个循环,因为递归堆栈大小限制,而且您无法控制递归的深度这种方式。)

在处理列表或可迭代对象时,访问它们的首选方法是在循环中迭代( for (var v in values)...for (var i = 0; i < list.length; i++)... list[i]... ),或者使用一个助手 function 像values.forEach((value) { doSomething(value); }); .

无论如何,您要计算的只是values.length ,因此比递归做得更好并不难。

您可以使用sublist方法

int sumsReccur(List<int> n) {
  if (n.length <= 0) {
    return 0; //base case
  }
  return subReccur(n.sublist(1));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM