相关疑难解决方法(0)

什么是尾部呼叫优化?

很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?

language-agnostic algorithm recursion tail-recursion tail-call-optimization

765
推荐指数
8
解决办法
15万
查看次数

理解javascript和替代中的递归

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)

jsbin

我无法从谷歌找到我的问题的直接答案,所以虽然得到SO专家的帮助.我假设它与浏览器内存有关,因为我可以看到循环以很快的速度启动并慢慢减速并变得无响应.但不确定为什么?

javascript recursion

2
推荐指数
1
解决办法
889
查看次数

从选择排序中消除尾递归

代码:(我尝试翻译成 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)

作业问题要求消除此代码中的尾递归。这是否意味着用迭代循环替换最后一次递归调用?或者添加额外的递归调用?

我认为问题可能源于我不知道常规递归和尾递归算法之间的区别。如果我错了,请纠正我,但我的理解是尾递归用于通过减少递归调用的次数来提高效率,除非调用是代码中的最后一条指令。关键在于,较少的递归调用意味着较少的递归堆栈存储在内存中。

编辑:代码中交换调用中的错误已修复。

algorithm recursion

0
推荐指数
1
解决办法
257
查看次数