在javascript中实现递归反向函数

在javascript中实现递归反向函数,javascript,recursion,Javascript,Recursion,我正试图写一个函数来反转列表。该函数是递归的 我知道javascript没有TCO,但我还是想尝试一下: reverse = function(list) { if (list.length < 2) { return list } fk = fork(list); return reverse(fk.tail).concat([fk.head]) } 当我用列表[1,2,3,4,5]调用reverse时,我得到以下结果: reverse([1,2,3,4,5])

我正试图写一个函数来反转列表。该函数是递归的

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

reverse = function(list) {
    if (list.length < 2) { return list }
    fk = fork(list);
    return reverse(fk.tail).concat([fk.head])
}
当我用列表[1,2,3,4,5]调用reverse时,我得到以下结果:

reverse([1,2,3,4,5]) // [5,4,4,4,4]
不知道我做错了什么。预期结果为[5,4,3,2,1]


请帮忙。

你应该修改你的代码,这会帮你很大的忙。特别是,此代码失败,因为fk被视为全局变量。如果在其前面加上var,则可以:

var reverse = function(list) {
    if (list.length < 2) { return list }
    var fk = fork(list);
    return reverse(fk.tail).concat([fk.head])
}
至于尾部递归,这里有一种可能的方法:

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);
}

你应该修改你的代码,这会给你很大的帮助。特别是,此代码失败,因为fk被视为全局变量。如果在其前面加上var,则可以:

var reverse = function(list) {
    if (list.length < 2) { return list }
    var fk = fork(list);
    return reverse(fk.tail).concat([fk.head])
}
至于尾部递归,这里有一种可能的方法:

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);
}

你知道我知道这已经是天生的了,但我想以学术的兴趣来建造它。你知道我知道这已经是天生的了,但我想以学术的兴趣来建造它。这行返回tail\u recursive\u reversetail,res.unshifthead,res;使用3个参数而不是两个参数调用尾部递归函数。你的意思是最后两个在一个数组中吗?不,这里有两个参数;第二个是逗号表达式的结果,它是它的第二个操作数-res。括号的出现是有原因的。逗号表达式需要什么?res.unshifthead返回数组的新长度,而不是数组本身。但在这种情况下,人们希望res能得到进一步的通过。当然,这不是必需的,可以将res.unshifthead作为独立表达式编写。我已经重写了,因为它似乎引起了混乱。有趣的是。。。我不知道有人能做到。谢谢你的解释。这行返回tail\u recursive\u reversetail,res.unshifthead,res;使用3个参数而不是两个参数调用尾部递归函数。你的意思是最后两个在一个数组中吗?不,这里有两个参数;第二个是逗号表达式的结果,它是它的第二个操作数-res。括号的出现是有原因的。逗号表达式需要什么?res.unshifthead返回数组的新长度,而不是数组本身。但在这种情况下,人们希望res能得到进一步的通过。当然,这不是必需的,可以将res.unshifthead作为独立表达式编写。我已经重写了,因为它似乎引起了混乱。有趣的是。。。我不知道有人能做到。谢谢你的解释。