javascript - 在javascript中实现递归反向函数

标签 javascript recursion

我正在尝试编写一个反转列表的函数。该函数是递归的。

我知道 javascript 没有 TCO,但我还是想试验一下:

reverse = function(list) {
    if (list.length < 2) { return list }
    fk = fork(list);
    return reverse(fk.tail).concat([fk.head])
}

fork 函数将列表拆分为头部和尾部:

fork = function(list) {return {head: list[0], tail: list.slice(1)}}

当我用列表 [1,2,3,4,5] 调用 reverse() 时,我得到了这个结果:

reverse([1,2,3,4,5]) // [5,4,4,4,4]

不确定我在这里做错了什么。预期结果是 [5,4,3,2,1]

请帮忙。

最佳答案

您应该对代码进行 lint,这会对您有很大帮助。特别是,此代码失败,因为 fk 被视为全局变量。如果您在它前面加上 var,它会起作用:

var reverse = function(list) {
    if (list.length < 2) { return list }
    var fk = fork(list);
    return reverse(fk.tail).concat([fk.head])
}

就目前而言,在每次递归调用中,您修改相同的 fk 变量,本质上意味着连接相​​同的 fk.head - 最后一个元素之前的元素。


事实上,你在这里甚至不需要临时变量:

function recursive_reverse(list) {
  return list.length < 2 ? list : recursive_reverse(list.slice(1)).concat([list[0]]);
}

至于尾递归,这里有一种可能的方法:

function recursive_reverse(list) {
  return tail_recursive_reverse(list, []);
}

function tail_recursive_reverse(list, res) {
  if (!list.length) return res;
  var head = list[0];
  var tail = list.slice(1);
  res.unshift(head);
  return tail_recursive_reverse(tail, res);
}

关于javascript - 在javascript中实现递归反向函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35183842/

相关文章:

javascript - 简单的 Javascript 在 Wordpress/WooCommerce 插件中不起作用

javascript - 将嵌套对象数组扩展到路径数组的最快方法(lodash)

java - 功能: is this binary search tree "odd balanced"?

Python - 不能 "end"递归函数

javascript - 通过服务与多级对象交互

javascript - 是否可以查看基于 Firebase 密码的帐户的密码?

javascript - $ (".box a").live ("click"怎么修改

node.js - Go 有一个 "infinite call stack"等价物吗?

c - 递归二叉树

SQL递归逻辑