Advertisement
Guest User

lele

a guest
May 29th, 2014
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 9.10 KB | None | 0 0
  1. type Tree<'a> =
  2. | Lf
  3. | Br of 'a * Tree<'a> * Tree<'a>;;
  4.  
  5. let A = Br( (1005,"budi"), Br((1002, "anto"), Br((1001, "tato"),Lf, Lf), Br((1003, "anca"),Lf, Lf)) , Br((1008, "andi"), Br((1006, "ani"),Lf, Lf), Br((1007, "didi"),Lf, Lf)) );;
  6.  
  7. let F = [(1001, 1002); (1001, 1006); (1005, 1007); (1006, 1008)];;
  8. let fsn = (A,F);;
  9.  
  10. (*=========================1.isMember(fsn,id)====================================================*)
  11.  
  12. let rec isMemberHelp = function
  13. | (Lf,F),idN -> false
  14. | ((Br((id,name),anakKiri,anakKanan),F),idN) -> if idN = id then true
  15.                                                 elif idN < id then isMemberHelp((anakKiri,F),idN)
  16.                                                 else isMemberHelp((anakKanan,F),idN);;
  17.                                                
  18. let isMember (fsn,id) = isMemberHelp(fsn,id);;
  19.  
  20. isMember (fsn,1005);;
  21.  
  22.  
  23. (*=========================2.whoIs(fsn,id)====================================================*)
  24.  
  25. let rec whoIsHelp = function
  26. | (Lf,F),idWanted -> raise(System.ArgumentException("Tidak Ada!!"))
  27. | ((Br((id,name),anakKiri,anakKanan),F),idWanted) -> if idWanted = id then name
  28.                                                      elif idWanted < id then whoIsHelp((anakKiri,F),idWanted)
  29.                                                      else whoIsHelp((anakKanan,F),idWanted);;
  30.  
  31. let whoIs (fsn, id) = whoIsHelp(fsn,id);;
  32. whoIs (fsn, 1005);;
  33. (*=========================3.updateName(fsn,id,newName)====================================================*)
  34.  
  35. let rec updateNameHelp = function
  36. | (Lf,F),id, newName -> raise(System.ArgumentException("Tidak Ada!!"))
  37. | ((Br((id,name),anakKiri,anakKanan),F),idChanged, newName) -> if idChanged < id then Br((id,name), updateNameHelp((anakKiri,F),idChanged, newName),anakKanan)
  38.                                                                elif id < idChanged then Br((id,name), anakKiri, updateNameHelp((anakKanan, F), idChanged, newName))
  39.                                                                else Br((id,newName),anakKiri,anakKanan);;
  40.  
  41. let updateName (fsn, id, newName) = updateNameHelp(fsn,id,newName);;
  42. updateName(fsn, 1005, "banu");;
  43.  
  44. (*=========================4.join(fsn,newId,newName)====================================================*)
  45.  
  46. let rec joinHelp = function
  47. | ((Lf, F),newId,newName) -> Br ((newId, newName),Lf,Lf)
  48. | ((Br((id,name),anakKiri,anakKanan),F),newId, newName) -> if newId < id then Br((id,name), joinHelp((anakKiri, F), newId, newName),anakKanan)
  49.                                                            elif (newId > id) then Br ((id,name), anakKiri, joinHelp ((anakKanan,F), newId, newName))
  50.                                                            else raise(System.ArgumentException("Sudah Ada!!"));;
  51. let join (fsn,newId,newName) = joinHelp(fsn,newId,newName);;
  52.  
  53. join (fsn, 1011, "yati");;
  54. (*=========================5.removeAccount(fsn, id)====================================================*)
  55.  
  56. let rec delMin = function
  57.  | Br ((id,name), Lf, anakKanan) -> ((id,name), anakKanan)
  58.  | Br ((id,name), anakKiri, anakKanan) -> let (minEl, new_anakKiri) = delMin anakKiri
  59.                                           (minEl, Br((id,name), new_anakKiri, anakKanan));;
  60.                                            
  61. let rec removeA = function
  62.  | (Lf, idDel) -> Lf
  63.  | (Br ((id,name), anakKiri, anakKanan), idDel) ->
  64.  if (idDel < id) then Br ((id,name), removeA (anakKiri, idDel), anakKanan)
  65.  elif (idDel > id) then Br ((id,name), anakKiri, removeA (anakKanan, idDel))
  66.  else match anakKanan with
  67.  | Lf -> anakKiri
  68.  | _ -> let (minEl, new_anakKanan) = delMin anakKanan (*e = v*)
  69.         Br (minEl, anakKiri, new_anakKanan);;
  70.                                                              
  71. let rec removeF = function
  72. | [],delId -> []
  73. | ((idFollower,idFollowee)::xs),delId -> if delId = idFollower || delId = idFollowee then removeF (xs,delId)
  74.                                          else ((idFollower, idFollowee)) :: removeF (xs,delId);;
  75.  
  76. let rec removeAccount ((A,F),id) = (removeA(A,id),removeF(F, id));;
  77.  
  78. removeAccount (fsn, 1005);;
  79.  
  80. (*=========================6.listOfAccounts(fsn)====================================================*)
  81. let rec listOfAccountsHelper = function
  82. |Lf -> []
  83. |Br((id,name),anakKiri,anakKanan) -> listOfAccountsHelper anakKiri @ [id,name] @ listOfAccountsHelper anakKanan;;
  84.  
  85. let rec listOfAccounts((A,F)) = listOfAccountsHelper(A);;
  86.  
  87. listOfAccounts(fsn);;
  88. A;;
  89. (*=========================7.mergeAccount(fsn1, fsn2)====================================================*)
  90.  
  91. let rec joinMergeHelper = function
  92. | (Lf,newId,newName) -> Br ((newId, newName),Lf,Lf)
  93. | (Br((id,name),anakKiri,anakKanan),newId, newName) -> if newId < id then Br((id,name), joinMergeHelper(anakKiri, newId, newName),anakKanan)
  94.                                                            elif (newId > id) then Br ((id,name), anakKiri, joinMergeHelper (anakKanan, newId, newName))
  95.                                                            else (Br((id,name),anakKiri,anakKanan));;
  96. let rec mergeA= function
  97. | (fsn1, []) -> fsn1
  98. | (fsn1,(id,nama)::xs) -> mergeA(joinMergeHelper(fsn1,id,nama),xs);;
  99.  
  100. let rec searchF = function
  101. | ([],idFollower,idFollowee) -> false
  102. | ((id1,id2)::sisaListId,idFollower,idFollowee) -> if id1 = idFollower && id2 = idFollowee then true
  103.                                                    else searchF(sisaListId,idFollower,idFollowee);;
  104.  
  105. let rec mergeF = function
  106. | (fsn1,[]) -> fsn1
  107. | ([] , fsn2) -> fsn2
  108. | (fsn1, (idFollower,idFollowee)::sisaList) -> if searchF(fsn1,idFollower,idFollowee) = false then mergeF(fsn1@[(idFollower,idFollowee)],sisaList)else mergeF(fsn1,sisaList);;
  109.  
  110.  
  111. let rec mergeAccount ((A1,F1),(A2,F2)) = (mergeA(A1,A2),mergeF(F1,F2));;
  112. (*=============================================================================================================*)
  113.  
  114. let rec map f = function
  115. |[] -> []
  116. |x::xs -> (f x) :: map f xs;;
  117.  
  118. let rec foldl f = function
  119. |(e,[]) -> e
  120. |(e,x::xs) -> foldl f (f(e,x),xs);;
  121.  
  122. let rec foldr f = function
  123. |([],e) -> e
  124. |(x::xs,e) -> f(x, foldr f (xs,e));;
  125.  
  126. let rec maptree f = function
  127. |Lf -> Lf
  128. |(Br (v,t1,t2)) ->
  129.      Br (f v, maptree f t1, maptree f t2);;
  130.  
  131. let rec fold f e = function
  132. |Lf -> e
  133. |(Br (v,t1,t2)) ->
  134.       f (v, fold f e t1, fold f e t2);;
  135.  
  136. (*=========================1.reverseRelation(fsn)====================================================*)
  137. let getF(A,F)=F;;
  138.  
  139. let reverseRelation x = foldr (fun ((x,y),e) -> (y,x)::e) (getF(x),[]);;
  140.  
  141. reverseRelation fsn;;
  142. (*=========================2.checkFollowerId(fsn)====================================================*)
  143. let getF(A,F)=F;;
  144.  
  145. let checkFollowerId x = foldr (fun ((x,y),e) -> if x<y then 1::e else 0::e) (getF(x),[]);;
  146.  
  147. checkFollowerId fsn;;
  148. (*=========================3.getTotalFollowers(fsn, id)====================================================*)
  149. let getF(A,F)=F;;
  150.  
  151. let getTotalFollowers (x,y) = foldr (fun ((a,b),e) -> if y = b then e+1 else e) (getF(x),0);;
  152.  
  153. getTotalFollowers (fsn,1002);;
  154. (*=========================4.getTotalFollowees(fsn, id)====================================================*)
  155. let getF(A,F)=F;;
  156.  
  157. let getTotalFollowees (x,y) = foldr (fun ((a,b),e) -> if y = a then e+1 else e) (getF(x),0);;
  158.  
  159. getTotalFollowees (fsn,1001);;
  160. (*=========================5.listOfFollowers(fsn, id) ====================================================*)
  161. let fsn= (A,F);;
  162. let getF(A,F)=F;;
  163.  
  164. let rec whoIs = function
  165. |((Lf,F),idWanted) -> raise(System.ArgumentException("Id tidak ada"))
  166. |((Br((id,name),t1,t2),F),idWanted) ->
  167.     if (idWanted<id) then whoIs ((t1,F), idWanted)
  168.     elif (idWanted>id) then whoIs ((t2,F),idWanted)
  169.     else name;;
  170.  
  171. let listOfFollowers (x,y) = foldr (fun ((a,b),e) -> if y = b then whoIs(x,a)::e else e) (getF(x),[]);;
  172.  
  173. listOfFollowers (fsn,1005);;
  174. (*=========================6.listOfFollowees(fsn, id)====================================================*)
  175. let getF(A,F)=F;;
  176.  
  177. let rec whoIs = function
  178. |((Lf,F),idWanted) -> raise(System.ArgumentException("Id tidak ada"))
  179. |((Br((id,name),anakKiri,anakKanan),F),idWanted) ->
  180.     if (idWanted<id) then whoIs ((anakKiri,F), idWanted)
  181.     elif (idWanted>id) then whoIs ((anakKanan,F),idWanted)
  182.     else name;;
  183.  
  184. let listOfFollowees (x,y) = foldr (fun ((a,b),e) -> if y = a then whoIs(x,b)::e else e) (getF(x),[]);;
  185. whoIs(fsn,1005);;
  186. listOfFollowees (fsn,1005);;
  187. (*=========================7.checkMutualRelation(fsn, id1, id2)====================================================*)
  188. let getF(A,F)=F;;
  189.  
  190. let checkMutualRelation1(x,y,z) = foldr (fun ((a,b),e) -> if a=y && b=z then true else e) (getF(x),false);
  191. let checkMutualRelation2(x,y,z) = foldr (fun ((a,b),e) -> if a=z && b=y then true else e) (getF(x),false);
  192.  
  193. let checkMutualRelation(fsn,id1,id2)=checkMutualRelation1(fsn,id1,id2) && checkMutualRelation2(fsn,id1,id2);;
  194.  
  195. checkMutualRelation(fsn,1001,1002);;
  196. (*=========================8.listOfIds(fsn)====================================================*)
  197. let rec maptree f = function
  198. |Lf -> Lf
  199. |(Br (v,t1,t2)) ->
  200.      Br (f v, maptree f t1, maptree f t2);;
  201.  
  202. let getA(A,F)=A;;
  203.  
  204. let listOfIds x = maptree (fun (id,nama) -> id) (getA(x));;
  205.  
  206. listOfIds fsn;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement