List 为什么我的concat列表顺序错误?
我正在尝试制作一个示例函数tail recursive。 以下是原始函数:List 为什么我的concat列表顺序错误?,list,f#,functional-programming,tail-recursion,List,F#,Functional Programming,Tail Recursion,我正在尝试制作一个示例函数tail recursive。 以下是原始函数: 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 =
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将产生一个新的列表,其顺序是先列出1个元素,然后列出2个元素您刚才假定了
@
的错误优先级;你所得到的被解释为
(sCTR xs ys acc)@[x]@[y]
但你想要的是
sCTR xs ys (acc@[x]@[y])
您刚刚假定了
@
的错误优先级;你所得到的被解释为
(sCTR xs ys acc)@[x]@[y]
但你想要的是
sCTR xs ys (acc@[x]@[y])
啊,我明白了。这很有道理——非常感谢。一旦计时器用完,我会把它标记为正确答案。作为更一般的规则——函数应用程序总是比运算符具有更高的优先级。啊,我明白了。这很有道理——非常感谢。一旦计时器用完,我会将其标记为正确答案。作为更一般的规则,函数应用程序总是比运算符具有更高的优先级。