JavaScript 中的美丽排列


美丽排列

假设我们有从 1 到 num 的 num 个整数。我们定义一个**美丽排列**为一个由这些 num 个数字依次构成的数组,如果数组中第 i 个位置(1 ≤ i ≤ N)满足以下条件之一:-

  • 第 i 个位置的数字可以被 i 整除。

  • i 可以被第 i 个位置的数字整除。

问题

我们需要编写一个 JavaScript 函数,它接收一个数字 num 作为输入,并返回我们可以为 num 构造的美丽排列的数量。

例如,如果函数的输入为:

const input = 2

则输出应为:

const output = 2

输出解释

第一个美丽排列是 [1,2]

第二个美丽排列是 [2,1]

示例

代码如下:

 在线演示

const num = 4;
const countArrangements = (num = 1) => {
   let ans = 0
   const recur = (curr, vis) => {
      if (curr === 1){
         ans++;
      }else{
         for (let i = num; i; i--) {
            let possible = (i % curr === 0 || curr % i === 0);
            let visited = vis & 1 << i;
            if (possible && !visited){
               recur(curr-1, vis | 1 << i);
            }
         }
      }
   };
   recur(num, 0);
   return ans;
};
console.log(countArrangements(num));

代码解释

我们定义一个结果变量(**ans**),然后创建一个**递归函数**来遍历多个分支可能性。这个递归函数只需要两个参数:我们当前要放置哪个数字(curr)以及哪些位置已经被访问过(vis)。

输出

控制台输出将为:

8

更新于: 2021年3月3日

318 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.