2013-06-28 28 views
5

Jestem Student IT i rodzaj początkujących do SMLMax Wartość wieloosobowej Drzewa w SML

Ostatnio studiuje na egzamin znalazłem to ćwiczenie.

Dane: typu 'drzewo = Drzewo' a * „liście drzew

zdefiniować mtree funkcji: 'drzewo ->' a, która zwraca największą wartość spośród wszystkich węzłów w wieloosobowej drzewo, zgodnie ze zwykłą relacją zleceń w OCaml (< =)

Przyszedłem zrobić coś takiego poniżej, co oczywiście nie działa.

let rec mtree (Tree (r, sub)) = 
     let max_node (Tree(a, l1)) (Tree(b, l2)) = 
      if a >= b then (Tree(a, l1)) else (Tree(b, l2)) in 
     List.fold_left max_node r sub;; 

Po przeczytaniu odpowiedzi na to publikuję poprawiony kod.

let rec mtree (Tree(r,sub)) = 
    let max_node (Tree(a, l1)) (Tree(b, l2)) = 
     if a >= b then a else b in 
    List.fold_left (max_node) r (List.map mtree sub);; 

Pomysł jest taki sam, złóż listę porównujące węzły wykorzystanie mojego lokalnego funkcji, aby to zrobić i podróż przez drzewa wywołując funkcję sama nad listami węzłach kolejnych poziomów.

Nadal nie działa, chociaż. Teraz skarży się na max_node w części fold_left.

Error: This expression has type 'a tree -> 'a tree -> 'a 
     but an expression was expected of type 'a tree -> 'a tree -> 'a tree 

I tu mam zdecydowanie stracił, ponieważ nie mogę zrozumieć, dlaczego nie spodziewa się zwracać „drzewa

+0

Czy możesz wyjaśnić, czego się spodziewasz i co się właściwie dzieje? – Abizern

+0

To, czego się spodziewam, nie jest niczym innym niż to, o co prosi ćwiczenie. To, co się dzieje, to to, że najwyższy poziom OCaml narzeka na to, że typ sub jest "listą drzewiastą". – Trigork

+0

Wskazówka: spróbuj zapisać funkcję rekursywną, która pobiera dwa argumenty (wartość 'v: 'a' i drzewo' t:' drzewo ') i oblicza maksimum' v' i maksimum 't' – Thomash

Odpowiedz

4

kod ten jest dość wiarygodne (IMHO). Kluczową rzeczą, której brakuje, jest to, że nie przemierza podległych poddrzew. Zauważ, że definiujesz swoją funkcję jako rekursywną (co jest bardzo rozsądne), ale nigdy się nie nazywa.

Inną kwestią, na którą należy zwrócić uwagę, jest to, że instrukcja problemu wywołuje "wartość" z drzewa, ale Twój kod zwraca cały węzeł drzewa.

+0

You ma rację co do rekurencji. Silly me – Trigork

2

Odpowiadając na moje własne pytanie jest trochę ułomne, ale dzięki podpowiedziom tutaj mogę je zakończyć. Zostawiam tutaj mój kod dla każdego, kto ma podobne problemy.

let maxt (Tree(r,b)) = 
    let rec aux (Tree(r,b)) = 
     match b with 
     [] -> [r] 
     |l -> [r]@(List.fold_right (@) (List.map aux b) []) 
    in List.fold_left max r (aux (Tree(r,b)));; 
+0

Jak sądzisz, jaka jest złożoność tej odpowiedzi? W rzeczywistości jest bardzo źle, jestem pewien, że możesz go poprawić. Dlaczego nie wpadłeś na swój pierwszy pomysł po prostu przemierzając drzewo? – Thomash