为了账号安全,请及时绑定邮箱和手机立即绑定

Codewars Kata 上的递归问题 - Snail Trail

Codewars Kata 上的递归问题 - Snail Trail

慕斯王 2022-01-13 17:30:28
对编码非常陌生,所以请多多包涵。我正在尝试在 Codewars 上解决这个 Kata:https ://www.codewars.com/kata/snail/train/javascript基本上给定一个数组[     [1, 2, 3, 4],     [12,13,14,5],     [11,16,15,6],     [10,9, 8, 7]];它会返回[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]。围绕矩阵外部和内部的蜗牛轨迹。我只是解决矩阵是 nxn 的情况,其中 n > 1 并且现在是偶数。我通过在函数外部声明 outputarray 来使其工作,但我希望在函数内声明该数组,因此包含以下行: var outputarray = outputarray || [];不知道我哪里出错了。snail = function(array) {  if (array.length == 0) {    return outputarray  }  var n = array[0].length - 1;  var outputarray = outputarray || [];  for (var i = 0; i <= n; i++) {    outputarray.push(array[0].splice(0, 1));  }  for (var i = 1; i <= n; i++) {    outputarray.push(array[i].splice(n, 1));  }  for (var i = n - 1; i >= 0; i--) {    outputarray.push(array[n].splice(i, 1));  }  for (var i = n - 1; i > 0; i--) {    outputarray.push(array[i].splice(0, 1));  }  array.pop();  array.shift();  snail(array);}
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

这是一种不会改变 input 的非递归方法array。它通过跟踪左上角坐标和螺旋线x, y的大小来工作。n


snail = function(array) {

  const { length } = array;

  const result = [];

  let x = 0;

  let y = 0;

  let n = length;


  while (n > 0) {

    // travel right from top-left of spiral

    for (let i = x; i < x + n; ++i) result.push(array[y][i]);


    // shrink spiral and move top of spiral down

    n--; y++;


    // travel down from top-right of spiral

    for (let i = y; i < y + n; ++i) result.push(array[i][x + n]);


    // travel left from bottom-right of spiral

    for (let i = x + n - 1; i >= x; --i) result.push(array[y + n - 1][i]);


    // shrink spiral

    n--;


    // travel up from bottom-left of spiral

    for (let i = y + n - 1; i >= y; --i) result.push(array[i][x]);


    // move left of spiral right

    x++;

  }


  return result;

}


console.log(snail([[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]));



查看完整回答
反对 回复 2022-01-13
?
MMTTMM

TA贡献1869条经验 获得超4个赞

一种选择是在 inside 定义另一个函数snail,它递归地调用自身,同时定义outputarrayinside snail。这样,outputarray不会暴露给外部范围,但递归函数仍然可以看到它。


另请注意,它splice返回一个数组,所以现在,您outputarray由一个数组数组组成。改为push展开来修复它,使outputarray成为一个数字数组:


const input = [

  [1, 2, 3, 4],

  [12, 13, 14, 5],

  [11, 16, 15, 6],

  [10, 9, 8, 7]

];


const snail = (array) => {

  const outputarray = [];

  const iter = () => {

    if (array.length == 0) {

      return

    }

    var n = array[0].length - 1;

    for (var i = 0; i <= n; i++) {

      outputarray.push(...array[0].splice(0, 1));

    }

    for (var i = 1; i <= n; i++) {

      outputarray.push(...array[i].splice(n, 1));

    }

    for (var i = n - 1; i >= 0; i--) {

      outputarray.push(...array[n].splice(i, 1));

    }

    for (var i = n - 1; i > 0; i--) {

      outputarray.push(...array[i].splice(0, 1));

    }

    array.pop();

    array.shift();

    iter(array);

  };

  iter(array);

  return outputarray;

}


console.log(snail(input));


查看完整回答
反对 回复 2022-01-13
?
跃然一笑

TA贡献1826条经验 获得超6个赞

这可能不符合 kata 的规则(或精神?),但是,您可以将它们粘在一起并分类。


function snail(trail) {

  const numeric = (a, b) => a - b

  const gather = (items, item) => items.push(parseInt(item, 10)) && items

  const inline = (route, points) => points.reduce(gather, route) && route

  const order = paths => paths.reduce(inline, []).sort(numeric)


  return order(trail)

}


const trail = [

    [1, 2, 3, 4], 

    [12, 13, 14, 5], 

    [11, 16, 15, 6], 

    [10, 9, 8, 7]

]


console.log(JSON.stringify(snail(trail)))


查看完整回答
反对 回复 2022-01-13
  • 3 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信