堆的算法返回数组而不是打印

Posted

技术标签:

【中文标题】堆的算法返回数组而不是打印【英文标题】:Heap's algorithm to return array instead of printing 【发布时间】:2019-03-13 10:12:54 【问题描述】:

我试图让这个堆算法返回一个排列数组,而不是如下打印。我知道这可以通过在函数外部声明一个数组并推送到它来完成,但是我想避免这种方法。如何在不使用外部数组的情况下使其返回排列数组?

function heaps(arr, n) 
  if (n === undefined) n = arr.length;
  if (n <= 1) console.log(arr);
  else 
    for (let i = 0; i <= n - 1; i++)
     
      heaps(arr, n-1);
      if 
        (n % 2 === 0) [arr[n-1], arr[i]] = [arr[i], arr[n-1]];
      else             
        [arr[n-1], arr[0]] = [arr[0], arr[n-1]];
    
  

【问题讨论】:

声明一个数组和一个辅助函数inside外部函数。 【参考方案1】:

只需将 return 设为数组,然后从循环中的递归调用中收集返回值:

function heaps(arr, n = arr.length) 
  if (n <= 1) return [arr.slice()];
  let result = [];
  for (let i = 0; i <= n - 1; i++) 
    result.push(...heaps(arr, n-1));
    if (n % 2 === 0)
      [arr[n-1], arr[i]] = [arr[i], arr[n-1]];
    else             
      [arr[n-1], arr[0]] = [arr[0], arr[n-1]];
  
  return result;

或者,制作一个确实推送到外部数组的内部辅助函数

function heaps(arr) 
  let result = [];
  function helper(n) 
    if (n <= 1)
      result.push(arr.slice());
    else
      for (let i = 0; i <= n - 1; i++) 
        heaps(n-1);
        if (n % 2 === 0)
          [arr[n-1], arr[i]] = [arr[i], arr[n-1]];
        else             
          [arr[n-1], arr[0]] = [arr[0], arr[n-1]];
      
  
  helper(arr.length);
  return result;

如果您坚持不使用“外部”数组,请将 result 数组和输入 arr 设置为辅助函数的显式参数。

【讨论】:

谢谢!第一个是我要找的。我正在努力删除从递归调用返回的数组层。

以上是关于堆的算法返回数组而不是打印的主要内容,如果未能解决你的问题,请参考以下文章

在 Heap 的递归算法中返回一个数组

算法-滑动窗口的中位数(堆)

教义queryBuilder:返回对象而不是数组

返回零长度的数组或者集合,而不是null

从数组中删除最后一项(而不是返回项)

剑指 Offer 06. 从尾到头打印链表