javascript - Javascript中的排列
问题描述
我正在尝试用 Javascript 编写一个函数,该函数可以返回排列的数量,并使用递归方法显示字符串的所有排列(假设没有重复的字符)。我已经看到很多使用for
循环,但是有没有一种方法可以在不使用它的情况下获得相同的结果?
对于排列的数量,这是我不使用for
循环的尝试
var permutation = function (s) {
var fac = function (t) {
if (t === 0) return 1;
return t*fac(t-1);
};
return fac(s.length);
};
它运作良好,但我不知道如何继续排列列表。谢谢您的帮助!
解决方案
这个版本使用了一个相当简单的递归:
const without = (n) => (xs) =>
[... xs .slice (0, n), ... xs .slice (n + 1)]
const permutations = (xs) =>
xs .length == 0
? []
: xs .length == 1
? [[xs[0]]]
: // else
xs .flatMap ((x, i) => permutations (without (i) (xs)) .map (p => [x, ...p]))
const stringPermutations = (s) => {
return permutations (s .split ('')) .map (ss => ss .join (''))
}
console .log (
stringPermutations ('abcd')
)
.as-console-wrapper {min-height: 100% !important; top: 0}
有一个辅助函数 ,without
它返回没有给定索引的数组副本。例如,without (2) (['a', 'b', 'c', 'd', 'e', 'f'])
产量['a', 'b', 'd', 'e', 'f']
。这仅在我们的 main 函数中使用一次,并且可以轻松内联,但我发现按原样阅读更容易。
stringPermutations
只需将字符串更改为单字符字符串数组,调用permutations
然后将结果数组连接回字符串。
重要的部分是permutations
。它有两种基本情况:当输入数组为空时,它返回一个空数组。当它只有一个值时,它返回一个数组,其中包含一个包含该值的数组。在所有其他情况下,它依次为第一个元素选择每个元素,将其从列表中删除,并permutations
使用剩余列表递归调用后续位置。
推荐阅读
- mysql - 当我试图执行改变脚本时。在 MySql 中获取连接丢失错误
- salesforce-lightning - 闪电组件的全局动作类型在闪电社区的链接类型[磁贴菜单]下不可见
- laravel - Laravel Cashier 使用 Stripe 的 newSubscription 设置质量
- javascript - NodeJS Html-pdf:fs.readfilesync 如何异步/等待
- javascript - 如何在 AngularJS 中应用数组中的 CSS 代码?
- apache - 无法使用 Apache poi 在 excel 标题上设置图像
- javascript - 用于刻度带的 D3 自定义反转功能
- c - 有没有办法使用 C 代码验证正则表达式模式的语法
- zsh - 如何完成包含空格的可变数量的参数
- python - Visual Studio 中的 Django:“ImportError 无法导入名称 '_remove_dead_weakref'”