我想知道如何在F#中對兩個串列進行元素乘法。例子。[1;2;3] [1;2;3;4]=[2;4;6;4]. 我是個新手,還在為代碼的語法糾結。我的嘗試如下:
let plus list_1 list_2 = function
| list_1 list_2 -> [| for xi in list_1 yield
list_1[i] list_2[i]。
|];;
它只是給了我一個錯誤,但我不知道如何改變它,讓它變得正確。
另外,如果有人知道在F#中學習串列的初學地點,請指出正確的方向,我們將不勝感激。
uj5u.com熱心網友回復:
如果你有兩個相同大小的串列,那么最簡單的解決方案是使用List.map2函式。這需要兩個串列,并且它將一個指定的函式成對地應用 - 所以如果你把它作為一個函式傳給 ( ),它就會做你想要的事情:
let l1 = [1; 2; 3]
let l2 = [3; 2; 1]
List.map2 ( ) l1 l2
如果你的串列是不同大小的,那么這將會崩潰。我不認為有任何簡單的內置解決方案,但你可以定義一個函式pad來用零填充一個串列,然后確保兩個串列的大小相同:
let pad n l =
List.append l
(List.init (n-List.length l) (fun _ -> 0)
let l1 = [1; 2; 3]
let l2 = [3; 2; 1; 4]
let l = max (List.l1長度) (List.l2長度)
List.map2 ( ) (pad l l1) (pad l l2)
uj5u.com熱心網友回復:
與Tomas的答案類似,這使得兩個串列具有 "相同的"(無限的)長度(使用懶惰的Seq而不是急切的List),然后將結果修剪為兩個串列的最大長度:
let l1 = [1; 2; 3]
let l2 = [3; 2; 1; 4]
let zeroes = Seq.initInfinite (fun _ -> 0)
let result =
Seq.map2 ( ) (Seq.append l1 zeroes) (Seq.append l2 zeroes
|> Seq.take (max (List.l1 length) (List.l2 length)
|> Seq.toList
uj5u.com熱心網友回復:
這里有兩個不同的解決方案。兩者都結合了可以結合的元素,并將結果串聯到最后。
這取決于你如何理解他們的作業。
(*避免SO語法高亮問題*)
let add x y = x y
let mul x y = x * y
let dol f xs ys =
let minElements = min (List.length xs) (List.length ys)
List.append
(List.map2 f (List.take minElements xs) (List.take minElements ys))
(List.skip minElements (if List.length xs = minElements then yselse xs)
dol add [1;2;3] [2;3;4; 5; 6] (* [3; 5; 7; 5; 6] *)
dol mul [1; 2; 3] [2;3;4; 5; 6] (* [2; 6; 12; 5; 6] *)
let rec mol f xs ys =
match xs,ys with
| [],[] -> []
| [],ys -> ys
| xs,[] -> xs
| x::xs,y::ys -> (f x y) :: (mol f xs ys)
mol添加[1;2;3] [2;3;4; 5; 6] (* [3; 5; 7; 5; 6] *)
mol mul [1; 2; 3] [2;3;4; 5; 6] (* [2; 6; 12; 5; 6] *)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/308565.html
標籤:
