3

大家好,我是编程新手,我正在为学习和享受做一个问题。我在这一点上有点卡住了..问题来自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 个,则该功能不起作用。也许我需要一个辅助函数来首先对列表中的偶数和奇数元素进行排序?我希望有人可以帮助我朝着正确的方向追踪我的思想,直到那时我一直在努力。

4

2 回答 2

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], [])

解决了...不完全确定如何大声笑,需要更多练习才能掌握它。没有指针就无法做到...非常感谢尼克巴恩斯的帮助。

于 2012-10-13T04:16:15.167 回答
3

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

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

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

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