按索引切换列表中的 2 个元素 Haskell
Switching 2 elements in a list by index Haskell
我需要一个(或两个)函数来做这样的事情:
swap 2 [1,2,3,4] -> [1,3,2,4]
swap' 2 [1,2,3,4] -> [1,2,4,3]
第一个整数是我要向左和向右移动的值的索引(不能为 0 或我的列表的长度)。
我知道以前可能发过,但我找不到有用的东西。
模式匹配在这里很有用
swap 1 (x:y:rest) = y:x:rest
swap n (x:y:z:rest) = x : swap (n - 1) (y:z:rest)
swap _ _ = error "Not enough elements to swap"
请注意,这不能防止非正数 n
,您可以自己添加该功能。
处理这类问题的逻辑是考虑最简单的情况。对于这个问题,最简单的情况是您想要交换前两个元素,这通过模式匹配很容易。下一种情况是您想要交换不是前两个元素的两个元素,但这可以减少(通过递归)到交换子列表的前两个元素的情况。为了达到这种情况,您只需递减索引并移动到下一个元素。在所有其他情况下,您都会出错。
我需要一个(或两个)函数来做这样的事情:
swap 2 [1,2,3,4] -> [1,3,2,4]
swap' 2 [1,2,3,4] -> [1,2,4,3]
第一个整数是我要向左和向右移动的值的索引(不能为 0 或我的列表的长度)。
我知道以前可能发过,但我找不到有用的东西。
模式匹配在这里很有用
swap 1 (x:y:rest) = y:x:rest
swap n (x:y:z:rest) = x : swap (n - 1) (y:z:rest)
swap _ _ = error "Not enough elements to swap"
请注意,这不能防止非正数 n
,您可以自己添加该功能。
处理这类问题的逻辑是考虑最简单的情况。对于这个问题,最简单的情况是您想要交换前两个元素,这通过模式匹配很容易。下一种情况是您想要交换不是前两个元素的两个元素,但这可以减少(通过递归)到交换子列表的前两个元素的情况。为了达到这种情况,您只需递减索引并移动到下一个元素。在所有其他情况下,您都会出错。