SML - 获取列表索引
问题描述:
我正在处理一个程序,它将一个'+'或' - '附加到列表的某个元素上,具体取决于该元素的索引是奇数还是偶数(即交替总和清单)。SML - 获取列表索引
但是,我很难识别每个元素的索引是什么。我有代码,我认为应该追加正确的符号,使用if statements
和mod
fun alternating([]) = 0
| alternating(l) =
if List.nth(l,hd(l)) mod 2 == 0 then '+'@hd(l)@alternating(tl(l))
else '-'@hd(l)@alternating(tl(l))
然而,List.nth(l,hd(l))
总是返回第二个索引,而不是第一处的元素。
答
在关闭的机会,你真的只是想否定整数他们,你可以通过他们进行某种总结,如果它很奇怪,我只会否定论证。使用相互递归一个能做到这一点,没有任何明确的指标簿记:
fun alternate l =
let
fun alternate1 [] = []
| alternate1 (x::xs) = (~x) :: alternate2 xs
and alternate2 [] = []
| alternate2 (x::xs) = x :: alternate1 xs
in
alternate1 l
end
它的工作原理就像这样:
- alternate [1,2,3,4];
val it = [~1,2,~3,4] : int list
我会强烈建议您使用模式匹配,而不是hd
。
编辑讨论hd
作为一个经验法则,如果你需要hd
你可能需要tl
为好。 hd
是部分功能 - 如果列表为空,它将抛出Empty
。如果模式匹配,您可以方便地获取列表头部和尾部的变量,并且您可以看到需要处理空列表的视觉提醒。这是更美观,IMO,看到:
fun foo [] = ...
| foo (x::xs) = ...
比同等
fun foo l =
if null l
then ...
else (hd l) ... (tl l)
换句话说,你会得到更短,更干净的代码具有自动提醒,使其正确的。赢/赢。据我所知,以其他方式做这件事没有什么重大的优势。当然,您可能会发现自己处于一种情况,即您知道列表中至少有一个元素,而您不需要执行其他任何操作。你仍然必须考虑给你的情况,但这是一个很好的经验法则。
答
如果你想用一个指数来装饰你的列表,你可以尝试像下面
fun add_index l =
let
fun add_index_helper (nil, _) = nil
| add_index_helper (h::tl,i) = (h,i) :: add_index_helper (tl,1+i)
in
add_index_helper (l,0)
end
val x = add_index [0,1,4,9,16,25]
,但你也可以直接计算奇偶校验用同样的方法
fun add_sign l =
let
fun add_sign_helper (nil, _) = nil
| add_sign_helper (h::tl,i) = (h,i) :: add_sign_helper (tl,1-i)
in
add_sign_helper (l,0)
end
val y = add_sign [0,1,4,9,16,25]
那么你可以将奇偶校验映射到字符串
fun sign_to_char (x,0) = (x,"+")
| sign_to_char (x,_) = (x,"-")
val z = List.map sign_to_char y
或者您可以直接添加符号
fun add_char l =
let
fun add_char_helper (nil, _) = nil
| add_char_helper (h::tl,0) = (h,"+") :: add_char_helper (tl,1)
| add_char_helper (h::tl,_) = (h,"-") :: add_char_helper (tl,0)
in
add_char_helper (l,0)
end
val zz = add_char [0,1,4,9,16,25]
或者,如果你有一个字符串列表,你想添加字符,你可以尝试这样的事情
fun signs L =
let
datatype parity = even | odd
fun signs_helper (nil ,_) = nil
| signs_helper (x::xs,even) = ("+"^x) :: signs_helper(xs,odd)
| signs_helper (x::xs,odd) = ("-"^x) :: signs_helper(xs,even)
in
signs_helper (L,even)
end
val z = signs ["x","2y","3z","4"]
(* this gives you val z = ["+x","-2y","+3z","-4"] : string list *)
输入和预期输出的示例将会有所帮助。输入是字符串列表吗? – 2014-10-30 20:49:48