我试图让一个示例函数尾递归。 这是原始功能:
let rec s xs ys =
match (xs, ys) with
|([],[]) -> []
|(xs, []) -> xs
|([], ys) -> ys
|(x::xs,y::ys) -> x::y::s xs ys
以下是我尝试使其递归递归:
let sC xs ys =
let rec sCTR xs ys acc =
match (xs, ys) with
|([],[]) -> acc
|(xs, []) -> acc@xs
|([], ys) -> acc@ys
|(x::xs,y::ys) -> sCTR xs ys acc@[x]@[y]
sCTR xs ys []
然而,我的问题是项目的顺序都是错误的。 当我在第一个函数中输入列表[1; 2; 3;] [7; 8;]时,得到结果[1; 7; 2; 8; 3] 但是当我在第二个函数中输入[1; 2; 3;] [7; 8;]时,我得到[3; 2; 8; 1; 7]
为什么订单错了?我认为list1 @ list2会产生一个新列表,首先是list1元素的顺序,然后是list2元素
答案 0 :(得分:4)
你刚刚假设@
的错误优先顺序;你得到的东西被解释为
(sCTR xs ys acc)@[x]@[y]
但你想要的是
sCTR xs ys (acc@[x]@[y])