很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?
language-agnostic algorithm recursion tail-recursion tail-call-optimization
当list以下代码中的数据很大时,为什么我的浏览器会变慢:
var list = [];
/*
Creating some huge dummy data
Interstingly, when I change the value of i from 10000
to 100000, the browser hangs(becomes unresponsive)
*/
for(i=0;i<10000;i++){
list.push(i);
}
/*Recursive function*/
var nextListItem = function() {
var item = list.pop();
if (item) {
console.log(item);
// process the list item...
nextListItem();
}
};
nextListItem(); // Commented this as browser becomes unresponsive.
Run Code Online (Sandbox Code Playgroud)
我无法从谷歌找到我的问题的直接答案,所以虽然得到SO专家的帮助.我假设它与浏览器内存有关,因为我可以看到循环以很快的速度启动并慢慢减速并变得无响应.但不确定为什么?
代码:(我尝试翻译成 Java。它是一种我不知道的不同语言):
selection_sort(int a, int b){
if(a == b+1){
//do nothing
}else{
i = minIndex(arr, a, b); //minIndex finds minimum value of 2 index's an array
if(i != a)
swap(arr, i, a);
selection_sort(a+1, b);
}
}
Run Code Online (Sandbox Code Playgroud)
作业问题要求消除此代码中的尾递归。这是否意味着用迭代循环替换最后一次递归调用?或者添加额外的递归调用?
我认为问题可能源于我不知道常规递归和尾递归算法之间的区别。如果我错了,请纠正我,但我的理解是尾递归用于通过减少递归调用的次数来提高效率,除非调用是代码中的最后一条指令。关键在于,较少的递归调用意味着较少的递归堆栈存储在内存中。
编辑:代码中交换调用中的错误已修复。