Sml 我想将一个列表拆分为奇偶元素的元组

Sml 我想将一个列表拆分为奇偶元素的元组,sml,Sml,大家好,我是编程新手,我在做一个学习和享受的问题。在这一点上我有点不知所措。。问题来自使用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]; 从中我得到: [(

大家好,我是编程新手,我在做一个学习和享受的问题。在这一点上我有点不知所措。。问题来自使用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个元素,则该函数不起作用。也许我需要一个助手函数来对列表中的偶数和奇数元素进行排序?我希望有人能帮我找到正确的方向,在那之前我会继续努力。

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

  • 您需要两个基本案例—一个用于
    []
    ,一个用于
    [x]
  • 您的一般案例只需要处理两个元素,而不是四个元素(将一个元素放在第一个列表中,将一个元素放在第二个列表中)
  • 目前,您得到的是
    split
    返回的是一个列表,而不是一个元组。第一个基本案例的结果应该是
    ([],[])
  • 在一般情况下,递归的
    splitxs
    将返回一个元组
    (ys,zs)
    。您需要提取这些值,并根据
    ys
    zs
    x1
    x2
    构建结果元组
(编辑)关于修改后的解决方案,有两点:

  • 您一次只需要处理两个元素-一般情况下应该是拆分x1::x2::xs
  • split[x,y]
    由一般情况处理-不需要另一个基本情况
  • 你错过了递归调用!元素最终出现在两个列表中,因为您将
    xs
    直接放在输出的两半中-您需要先拆分它。从
    let(ys,zs)=在…中拆分X

解决了它。。。不完全确定如何lol,需要更多的练习来掌握它。没有指针是不可能做到的。。。非常感谢尼克·巴恩斯的帮助

欢迎光临!为了使您的问题和代码更具可读性,请尝试在文章中使用一些格式。代码可以通过在每行前放置4个空格字符来格式化(或者通过高亮显示所有字符并按下编辑栏上的“代码”按钮)。对于高亮显示tipI,很多人以前从未使用过这种语言,但是如果你可以根据数组索引进行拆分,你可以使用类似(index mod 2)或indexA-(indexA>>1)的东西==指数-1.Thx 100倍。。这就把事情弄清楚了一点。我将在凌晨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], [])