1

를 사용하여삽입 종류의 종류</em></p> <p>나는이 해결책을 함께했습니다 내가 <strong>꼬리 재귀</strong> 및 <em>삽입 <strong>첫 번째 순서 프로그래밍</strong>를 사용하여 하스켈 알고리즘을 설계하고 싶습니다 꼬리 재귀 및 첫 번째 순서 기능

isort :: Ord a => [a] -> [a] 
isort [] = [] 
isort [x] = [x] 
isort (x:xs) = insert (isort xs) 
    where insert [] = [x] 
      insert (y:ys) 
      | x < y = x : y : ys 
      | otherwise = y : insert ys 

하지만 첫 번째 순서 꼬리 재귀를 사용하는지 잘 모르겠습니다.

사람이 사용하는 대체 솔루션을 마련 할 수

  • 꼬리 재귀
  • 첫 번째 순서 프로그래밍

감사합니다,

+1

꼬리 재귀를 사용하지 않습니다. 'insert :'('ys (insert ys)'로보다 명확하게 쓰여져있다.)'insert :'의'otherwise' 절은'y : insert ys'이다. 꼬리 위치에 –

+1

"1 차 프로그래밍"이란 무엇을 의미 할 수 있습니까? 그것은 인수로서의 기능을하지 않는 것입니다. – Lazersmoke

+0

@Lazersmoke 네, 정확하게 요. –

답변

1

이 꼬리 재귀를 사용하지 않고, 간단한 버전도 HOF

sort :: Ord a => [a] -> [a] 
sort [] = [] 
sort [x] = [x] 
sort (x:xs) = insert x (sort xs) 

insert :: Ord a => a -> [a] -> [a] 
insert x [] = [x] 
insert x (y:ys) | x < y  = x:y:ys 
       | otherwise = y:insert x ys 
,210

당신은 우리가 꼬리 재귀를 사용하여 정렬을 다시 할 수있는 축적, 추가 할 수 있습니다

sort' :: Ord a => [a] -> [a] 
sort' xs = sortAcc xs [] 

sortAcc :: Ord a => [a] -> [a] -> [a] 
sortAcc [] acc = acc 
sortAcc (x:xs) acc = sortAcc xs (insert x acc) 

insert이 예쁜 멋지게 인 방법을 정의를; 그러나 다만 고차 함수를 사용하는 목적 , 우리는 그것을 좋아 정의 할 수 있습니다 : 섹션 (<x)span에 전달 형 Ord a => a -> Bool의 함수이다

insert' :: Ord a => a -> [a] -> [a] 
insert' x xs = menores ++ x:mayores 
    where (menores,mayores) = span (<x) xs 

.