2017-03-08 3 views
0
내가 추적하는 데 문제

추적 :는 (정확하다)이 코드를 OCaml의 재귀 기능

let rec prepend (l: int list list) (x: int) : int list list = 
     begin match l with 
      | [] -> [] 
      | hd :: tl -> (x :: hd) :: (prepend tl x) 
     end 

prepend [[]; [2]; [2;3]] 1 = [[1]; [1;2]; [1;2;3]] 

내 추적이 잘못된 것입니다,하지만 난 잘못 모르겠어요 :

prepend ([]::2::[]::2::3::[]::[]) 1 = 
1::[]::prepend (2::[]::2::3::[]::[]) 1 = 
1::[]::1::2::prepend([]::2::3::[]::[]) 1 = 
1::[]::1::2::1::[]::prepend(2::3::[]::[]) 1 --> 
This is incorrect because then it comes out as [1] ; [1;2;1] 
when it should be [1]; [1;2] ; [1;2;3] 

답변

1

:: 연산자는 연관성이 없습니다. 즉 (a :: b) :: ca :: (b :: c)과 다릅니다. 따라서 괄호를 사용하여 하위 목록을 추적해야합니다. 지금 그것을 이해

당신이 거기까지 갈 수 어쩌면
prepend ([] :: (2 :: []) :: (2 :: 3 :: []) :: []) 1 => 
(1 :: []) :: prepend ((2 :: []) :: (2 :: 3 :: []) :: []) 1 => 
(1 :: []) :: (1 :: 2 :: []) :: prepend ((2 :: 3 :: []) :: []) 1 => ... 

....

+0

은, 정말 감사합니다! – user