a recursive list paradigm jack beidler yaodong bi bob mccloskey computing sciences university of...
TRANSCRIPT
A Recursive List Paradigm
Jack Beidler
Yaodong Bi
Bob McCloskey
Computing Sciences
University of Scranton
Scranton, PA 18510
A Recursive List Paradigm
• List Paradigms
• A Recursive List Paradigm
• Examples
• Unfocused vs. focused paradigms
• From the recursive paradigm to a positional paradigm
List Paradigms• Lists and the Java API
– Interface List and its implementations• 25 methods
• Swiss Army Knif Approach (multiple paradigms)
• Focused Paradigms - a few well chosen coordinated methods– Array Analogy Paradigm– Positional Paradigm (One-way)– Positional Paradigm (Two-way)– Recursive Paradigm
A Recursive List Paradigm• McCarthy’s LISP
http://www-formal.stanford.edu/jmc/history/lisp/lisp.html
– No compromise recursive paradigm– A list:
• isEmpty• or (head, tail)
– head is an object– tail is a (possibly empty) sublist
– A Java Implementation• 3 constructors• 6 methods• 2 utility methods
A Recursive List Paradigm
• ConstructorsRecursiveList ()
empty list
RecursiveList (Object Head)
non-empty list w empty tail
RecursiveList
(Object Head, RecursiveList Tail)list with tail
A Recursive List Paradigm
• Methodsboolean isEmpty()
RecursiveList tailOf()
Object getHead()
void setHead(Object NewHead)
void insert(RecursiveList List)
RecursiveList remove()
A Recursive List Paradigm
• Utility Methodsvoid swap(RecursiveList List)
String toString()
A Recursive List Paradigm
• What about iterator support– Recursion is the traversal method
Examples• OrderedList Class (composed with RecursiveList)
import java.util.*;
class OrderedList {
private Comparator c;
protected RecursiveList L;
OrderedList (Comparator c){
this.c=c;
L = new RecursiveList();
}
Examples• OrderedList Class (composed with RecursiveList)
…private void RecInsert (Object Obj, RecursiveList List){ if(List.isEmpty() || (c.compare(Obj, List.getHead())<0)) List.insert(new RecursiveList(Obj)); else RecInsert(Obj, List.tailOf());}
public void insert(Object Obj){ RecInsert(Obj, L);}
Examples• OrderedList Class (composed with RecursiveList)…private void Recmerge (RecursiveList Source1,
RecursiveList Source2, RecursiveList Merged){ if (Source1.isEmpty()) Merged.swap(Source2); else if (Source2.isEmpty()) Merged.swap(Source1); else { if (c.compare(Source1.getHead() , Source2.getHead())<0) Merged.insert(Source1.remove()); else Merged.insert(Source2.remove()); Recmerge(Source1, Source2, Merged.tailOf()); }}
Examples• OrderedList Class (composed with RecursiveList) …
public void merge(OrderedList Source1,
OrderedList Source2){
Recmerge(Source1.L, Source2.L, this.L);
}
public String toString(){
return L.toString();
}
}
Examples
• OrderedList Class (composed with RecursiveList)– Simplicity of insert– Simplicity of merge– But what about iteration?? (be patient)
Examples
• What about iterator support
Unfocused vs. focused paradigms
• G&T– 1 Constructors
– 13 Methods
– 0 Utility Methods
• RecursiveList– 3 Constructors
– 6 Methods
– 2 Utility methods
Unfocused vs. focused paradigms
• S– 2 Constructors
– 14 Methods
– 0 Utility Methods
• RecursiveList– 3 Constructors
– 6 Methods
– 2 Utility methods
Unfocused vs. focused paradigms
• C&P– 1 Constructors
– 7 Methods
– 0 Utility Methods
• RecursiveList– 3 Constructors
– 6 Methods
– 2 Utility methods
From the recursive paradigm to a positional paradigm
• What about iteration?
• What about the positional paradigm?
• Constructed on top of the recursive paradigm.
From the recursive paradigm to a positional paradigm
void front()
void rear()
void next()
void prev()
void append(Object O)
void setObject(Object O)
Object getObject()
boolean offRear()
boolean backingUp()
From the recursive paradigm to a positional paradigm
RecursiveList Order = new RecursiveList(); … RecursiveListIterator It = new RecursiveListIterator(Order); for (It.front(); !It.offRear(); It.next()) System.out.print(((Integer)It.getObject())+"\t"); System.out.println(); for (It.rear(); It.backingUp(); It.prev()) System.out.print(((Integer)It.getObject())+"\t"); System.out.println();
Conclusions
• Lean, mean, well focused is usually better that the Swiss Army Knife approachhttp://www.cs.scranton.edu/~beidler/java/OneWay/
• It is even nicer with trees– RecBinTree Classhttp://www.cs.scranton.edu/~beidler/java/RecBinTree/