[英]Recursion Haskell
我試圖實現這樣的事情:
mymin (x:[]) = x
mymin (x:y:xs) = mymin ((if x < y then x else y):xs)
mysort [] = []
mysort (x) = mymin x (mysort othervalues)
我知道這段代碼是錯的,但它只是想法。 如何使用返回遞歸的最小值來連接其余值。 輸入就像
mysort [7,9,3,7,1,2]
[1,**7,9,3,7,2**]
[1,2,**7,9,3,7**]
[1,2,3,**7,9,7**]
[1,2,3,7,**7,9**]
[1,2,3,7,7,**9**]
[1,2,3,7,7,9]
我想你正在嘗試實現選擇排序。
mymin
最好返回最小元素以及列表的其余元素。
mymin :: Ord a => [a] -> (a,[a])
mymin [x] = (x,[])
mymin (x:xs) = let (min,rest) = mymin xs
in if x < min then (x,min:rest) else (min,x:rest)
mysort :: Ord a => [a] -> [a]
mysort [] = []
mysort xs = let (min,rest) = mymin xs
in min:mysort rest
您需要從列表中刪除min的第一個出現並將其連接到其余部分的前面
mymin :: (Ord a) => [a] -> a
mymin [x] = x
mymin (x:y:xs) | x < y = mymin (x:xs)
| otherwise = mymin (y:xs)
myremove :: (Eq a) => a -> [a] -> [a]
myremove x [] = []
myremove x (y:ys) | x == y = ys
| otherwise = y: myremove x ys
mysort :: (Ord a) => [a] -> [a]
mysort [] = []
mysort [x] = [x]
mysort xs = x : mysort (myremove x xs) where x = mymin xs
基於Satvik的答案,你可以通過編寫mymin
來避免顯式遞歸
mymin :: Ord a => [a] -> (a, [a])
mymin (x : xs) = foldr f (x, []) xs where
f z (y, ys) = if y < z then (y, z : ys) else (z, y : ys)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.