我想将列表拆分为奇数和偶数元素的元组

时间:2012-10-13 00:42:40

标签: sml

大家好我很喜欢编程,我正在为学习和享受做一个问题。我有点卡在这一点..问题来自Introduction to Programming using Sml 5.9

我想拆分[x1, x2, x3, ... ,xn] = ([x1, x3,....], [x2, x4,...])

列表

这是我到目前为止所做的:

fun split [] =  []
  | split (x1::x2::x3::x4::xs) = ([x1, x3], [x2, x4])::split xs



val test1split = split [1, 1, 2, 3];

从此我得到:

[([1, 2], [1, 3])] ....(我想要一个包含拆分列表的元组,而不是显然)

如果有超过4个元素,则该功能不起作用。也许我需要一个辅助函数来首先对列表中的偶数和奇数元素进行排序?我希望有人可以帮我跟踪正确的方向,直到那时我一直在努力。

2 个答案:

答案 0 :(得分:4)

fun split [] = ([], [])   
  | split [x] = ([x], [])  
  | split (x1::x2::xs) = 
               let 
                 val (ys, zs) = split xs
               in 
                ((x1::ys), (x2::zs))
              end;



val test1split = split [1, 1, 2, 3, 5, 6] = ([1, 2, 5], [1, 3, 6])
val test2split = split [8, 7, 6, 5, 4, 3] = ([8, 6, 4], [7, 5, 3])
val test3split = split [8, 7] = ([8], [7])
val test4split = split [8] = ([8], [])

解决了......不完全确定lol怎么样,需要更多练习来掌握它。没有指针就不可能做到这一点......非常感谢Nick Barnes的帮助。

答案 1 :(得分:3)

我会尽量不要放弃太多,但这里有一些提示:

  • 您需要两个基本案例 - 一个用于[],一个用于[x]
  • 您的一般情况只需要处理两个元素,而不是四个(将一个放在第一个列表中,一个放在第二个列表中)
  • 目前,您已经split返回了一个列表,而不是一个元组。您的第一个基本案例的结果应为([],[])
  • 在一般情况下,递归split xs将返回元组(ys,zs)。您需要提取这些值,并根据yszsx1x2来构建生成的元组。

(编辑)您修改后的解决方案有几点:

  • 您只需要一次处理两个元素 - 一般情况应为split x1::x2::xs
  • split [x,y]由一般情况处理 - 不需要其他基本情况。
  • 你错过了递归电话!元素最终会出现在两个列表中,因为您将xs直接放入输出的两半 - 您需要先将其拆分。从中开始 let (ys, zs) = split xs in ...