[英]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.