[plt-scheme] Why does this code pause at the end
See Robby's answer for coverage
Consider the following code, too:
#lang scheme
(define vref vector-ref)
(define (pascal-row row)
(local ((define r (vector->list row)))
(list->vector (map + (cons 0 r) (append r (list 0))))))
(define (pascal n k)
(cond
[(> k n) (pascal k n)]
[else
(local ((define r ((apply compose (make-list (- n 1) pascal-row)) #(1))))
(+ (vref r (sub1 k)) (vref r k)))]))
(= 286191035203773536729215177959428379150929723879069881376273032504577219690326014732293768640
(pascal 345 235))
If it weren't for vector->list and list->vector, this would run in ISL+
On Mar 5, 2010, at 12:40 PM, wooks wrote:
> Running this in Advanced Student. It's a fast version of Pascals
> Triangle implemented by computing each row before it returns a result.
>
> The program returns it's result but a (relatively) long pause ensues
> before the scheme prompt appears. Wondering why.
>
> (define (pascal-row row)
> (cons 1
> (local [(define (sum-neighbours row)
> (if (or (empty? row)
> (empty? (rest row)))
> row
> (cons (+ (first row) (second row))
> (sum-neighbours (rest row)))))]
> (sum-neighbours row))))
>
> (define (pascal n k)
> (cond
> [(> k n) (pascal k n)]
> [else (local [(define (pascal m previous-row)
> (cond
> [(= m n) (+ (list-ref previous-row (sub1 k))
> (list-ref previous-row k))]
> [else (pascal (add1 m) (pascal-row previous-
> row))]))]
> (pascal 0 empty))]))
> (pascal 345 235)
> _________________________________________________
> For list-related administrative tasks:
> http://list.cs.brown.edu/mailman/listinfo/plt-scheme