我需要一个应该做这样的功能(或两个):
swap 2 [1,2,3,4] -> [1,3,2,4]
swap' 2 [1,2,3,4] -> [1,2,4,3]
第一个整数是我想要向左和向右移动的值的索引(它不能是0或我列表的长度)。
我知道之前可能已发布,但我找不到任何有用的东西。
答案 0 :(得分:1)
模式匹配在这里很有用
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
,您可以自己添加该功能。
解决这些问题的逻辑是考虑最简单的情况。对于这个问题,最简单的情况是你想要交换前两个元素,这对于模式匹配来说很容易。下一种情况是你要交换两个不是前两个元素的元素,但这可以减少(通过递归)到你交换子列表的前两个元素的情况。为了达到这种情况,你只需减少索引并移动到下一个元素。在所有其他情况下,您都有错误。