ahhh... to answer my own question (and if I had looked at the code
and the API a bit closer),
it turns out that "recur" can only be used in tail-position... and
your code (as a tree-recursor) would
not benefit from this.

On Dec 4, 5:39 pm, Daniel Eklund <[EMAIL PROTECTED]> wrote:
> oops...
>
> I am just learning the language right now.... and just quickly looked
> at what you did...
> Would the use of "recur" instead of self-calls potentially help
> consuming stack space?
>
> http://clojure.org/special_forms#toc10
>
> On Dec 4, 5:37 pm, Daniel Eklund <[EMAIL PROTECTED]> wrote:
>
> > I
>
> > On Dec 4, 2:55 pm, PeterB <[EMAIL PROTECTED]> wrote:
>
> > > Hi,
>
> > > I downloaded clojure_20080916.zip and had a go with a simple tree
> > > benchmark (cut-down version of the one in the computer language
> > > shootout  http://shootout.alioth.debian.org/).
>
> > > The Java version is pretty simple and runs in about 2s on my laptop:
>
> > > public class Main
> > > {
> > >     public static void main(String[] args)
> > >     {
> > >         System.out.println("result: " + sumTrees(10000, 10));
> > >     }
>
> > >     public static int sumTrees(int iterations, int depth)
> > >     {
> > >         int i;
> > >         int sum = 0;
>
> > >         for (i = 1; i <= iterations; i++)
> > >             sum += TreeNode.bottomUpTree(i, depth).itemCheck() +
> > >                         TreeNode.bottomUpTree(-i, depth).itemCheck();
> > >         return sum;
> > >     }
>
> > >     public static class TreeNode
> > >     {
> > >         private TreeNode left, right;
> > >         private int           item;
>
> > >         TreeNode(int item)
> > >         {
> > >             this.item = item;
> > >         }
>
> > >         TreeNode(int item, TreeNode left, TreeNode right)
> > >         {
> > >             this.left = left;
> > >             this.right = right;
> > >             this.item = item;
> > >         }
>
> > >         private static TreeNode bottomUpTree(int item, int depth)
> > >         {
> > >             if (depth > 0)
> > >                 return new TreeNode(item,
> > >                                                bottomUpTree(2*item-1,
> > > depth-1),
> > >                                                bottomUpTree(2*item,
> > > depth-1));
> > >             else
> > >                 return new TreeNode(item);
> > >         }
>
> > >         int itemCheck()
> > >         {
> > >             if (left == null)
> > >                 return item;
> > >             else
> > >                 return item + left.itemCheck() - right.itemCheck();
> > >         }
> > >     }
>
> > > }
>
> > > The Clojure version is considerably more compact and elegant:
>
> > > (defn make-tree [item depth]
> > >   (if (zero? depth)
> > >     (list item nil nil)
> > >     (let [item2 (* 2 item)  depth-1 (dec depth)]
> > >       (list item (make-tree (dec item2) depth-1) (make-tree item2
> > > depth-1)))))
>
> > > (defn check-tree [tree]
> > >   (if (nil? tree)
> > >     0
> > >     (let [[i l r] tree] (- (+ i (check-tree l)) (check-tree r)))))
>
> > > (defn sum-trees [iterations depth]
> > >   (let [sum #(+ (check-tree (make-tree % depth))
> > >                       (check-tree (make-tree (- %) depth)))]
> > >     (reduce #(+ %1 %2) 0 (map sum (range 1 (inc iterations))))))
>
> > >  (time (println "result:" (sum-trees 10000 10)))
>
> > > However, there is a heavy price to be paid for this elegance:
> > > 'Elapsed time: 100730.161515 msecs'
>
> > > Ouch! That's rather disappointing :-(
> > > Any suggestions for improving the performance?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to