F# 是否有更实用的方法将n个元素添加到列表的开头?

F# 是否有更实用的方法将n个元素添加到列表的开头?,f#,F#,我有一个函数,它接收一个整数并返回该数字的二进制列表: let DecimalToBase2 (n:int) = Convert.ToString(n,2) |> Seq.map (fun c -> int c - int '0') |> Seq.toList DToB 23 -> [1; 0; 1; 1; 1] DToB 511 -> [1; 1; 1; 1; 1; 1; 1; 1; 1] DToB 512 -

我有一个函数,它接收一个整数并返回该数字的二进制列表:

let DecimalToBase2 (n:int) = 
        Convert.ToString(n,2)
        |> Seq.map (fun c -> int c - int '0')
        |> Seq.toList

DToB 23  -> [1; 0; 1; 1; 1]
DToB 511 -> [1; 1; 1; 1; 1; 1; 1; 1; 1]
DToB 512 -> [1; 0; 0; 0; 0; 0; 0; 0; 0; 0]
我总是希望列表的长度为10,我需要在列表的开头附加“0”

我知道F#列表是不可变的,但我不知道我使用的代码是否是最好的方法

“屈服”是如何起作用的

是创建多个列表并附加它们,还是在运行时只创建一个

let DecToBase2 n =
    let xx = DecimalToBase2 n
    let result =
        [
            for i in xx.Length .. 9 do
                yield 0
            done
        ] @ xx
    result

D 23  -> [0; 0; 0; 0; 0; 1; 0; 1; 1; 1]
D 511 -> [0; 1; 1; 1; 1; 1; 1; 1; 1; 1]
D 512 -> [1; 0; 0; 0; 0; 0; 0; 0; 0; 0]

这里有一个稍微更实用的方法。这可能不是最短的方法,但当你试图掌握功能性思维时,你不应该这样做。我们要做的是使用一个函数计算位,然后使用另一个函数将结果填充到所需的长度。两者都将递归地执行此操作
loop
将数字的最低幅度位追加到列表中,然后除以2并重复,直到没有剩余位为止。然后
pad
在0之前加上前缀,直到列表达到所需大小(10):

或者使用单个辅助函数测试长度(honco在评论中的建议)

让d2b n=
让rec循环n lst=
如果List.length lst<10,则循环(n>>>1)((n&&1)::lst)否则lst
循环n[]

使用位运算符和递归函数的方法和性能要好得多。谢谢。使用单个“循环”并在“所需大小”上进行测试比使用转换的数字值更好。
let d2b n =    
    let rec loop n lst =
        if n > 0 then loop (n >>> 1) ((n &&& 1) :: lst) else lst

    let rec pad lst size filler =
        if (List.length lst < size) then pad (filler :: lst) size filler else lst

    pad (loop n []) 10 0
let d2b n = [for i = 9 downto 0 do yield (n >>> i) &&& 1]
let d2b n = 
    let rec loop n lst = 
        if List.length lst < 10 then loop (n >>> 1) ((n &&& 1) :: lst) else lst
    loop n []