我将如何生成包含变量字符列表的长度在x和y字符之间的字符串的所有可能排列的列表.
任何语言都可以使用,但它应该是可移植的.
我正在寻找一种算法来生成集合的排列,这样我就可以在Clojure中创建它们的惰性列表.即我想迭代一个排列列表,其中每个排列都不计算,直到我请求它,并且所有排列不必一次存储在内存中.
或者我正在寻找一种给定某个集合的算法,它将返回该集合的"下一个"排列,以这种方式在自己的输出上重复调用该函数将循环遍历原始集合的所有排列,一些订单(订单无关紧要).
有这样的算法吗?我见过的大多数排列生成算法都倾向于一次性生成它们(通常是递归的),这些算法不能扩展到非常大的集合.Clojure(或其他函数式语言)中的实现会有所帮助,但我可以从伪代码中找出它.
我最近为F#项目编写了以下组合和排列函数,但我很清楚它们远未优化.
/// Rotates a list by one place forward.
let rotate lst =
List.tail lst @ [List.head lst]
/// Gets all rotations of a list.
let getRotations lst =
let rec getAll lst i = if i = 0 then [] else lst :: (getAll (rotate lst) (i - 1))
getAll lst (List.length lst)
/// Gets all permutations (without repetition) of specified length from a list.
let rec getPerms n lst =
match n, lst with
| 0, _ -> …Run Code Online (Sandbox Code Playgroud) 我需要在给定列表上生成排列.我设法做到这一点
let rec Permute (final, arr) =
if List.length arr > 0 then
for x in arr do
let n_final = final @ [x]
let rest = arr |> List.filter (fun a -> not (x = a))
Permute (n_final, rest)
else
printfn "%A" final
let DoPermute lst =
Permute ([], lst)
DoPermute lst
Run Code Online (Sandbox Code Playgroud)
这段代码存在明显的问题.例如,列表元素必须是唯一的.而且,这与我在任何其他语言中生成直接实现时使用的方法相同.有没有更好的方法在F#中实现它.
谢谢!
有人能指出我在F#中进行多范式(对象功能)编程的例子吗?
我特意寻找结合OO和函数式编程的例子.关于F#是一种混合语言有很多话题,但是我找不到能够演示多范式编程示例的例子.
谢谢
关于F#中元素组合的最优雅和简单实现的另一个问题.
它应该返回输入元素的所有组合(列表或序列).第一个参数是组合中的元素数量.
例如:
comb 2 [1;2;2;3];;
[[1;2]; [1;2]; [1;3]; [2;2]; [2;3]; [2;3]]
Run Code Online (Sandbox Code Playgroud) 我的方法可能完全偏离正轨,但在解决这个问题的过程中,我试图得到一个数字0-9的所有排列的列表.
我正在寻找使用像这样的n-ary树来解决它:
type Node =
| Branch of (int * Node list)
| Leaf of int
Run Code Online (Sandbox Code Playgroud)
我对自己很满意,因为我已经设法弄清楚如何生成我想要的树.
我现在的问题是我无法弄清楚如何遍历这个树并将每个叶子的'path'作为int提取出来.令我困惑的事情是我需要匹配单个节点,但我的"外部"功能需要采用节点列表.
我当前的尝试几乎做了正确的事情,除了它返回我所有路径的总和......
let test = Branch(3, [Branch(2, [Leaf(1)]);Branch(1, [Leaf(2)])])
let rec visitor lst acc =
let inner n =
match n with
| Leaf(h) -> acc * 10 + h
| Branch(h, t) -> visitor t (acc * 10 + h)
List.map inner lst |> List.sum
visitor [test] 0 //-> gives 633 (which is 321 + 312)
Run Code Online (Sandbox Code Playgroud)
我甚至不确定这是尾递归. …
我想生成一个包含可变字符列表的字符串的所有可能排列的列表。例如,如果我有字符串“ABC”,我想要一个包含所有可能变体的列表,例如:A、B、C、AB、BC。
谢谢你。
f# ×6
algorithm ×2
combinations ×2
.net ×1
c# ×1
clojure ×1
list ×1
n-ary-tree ×1
oop ×1
permutation ×1
simplify ×1
string ×1