Ackermann function: Difference between revisions

added Ol
(added Ol)
Line 6,404:
m 1- n ifZero: [ 1 ] else: [ A( m, n 1- ) ] A
;</lang>
 
=={{header|Ol}}==
<lang scheme>
; simple version
(define (A m n)
(cond
((= m 0) (+ n 1))
((= n 0) (A (- m 1) 1))
(else (A (- m 1) (A m (- n 1))))))
 
(print "simple version (A 3 6): " (A 3 6))
 
; smart (lazy) version
(define (ints-from n)
(cons* n (delay (ints-from (+ n 1)))))
 
(define (knuth-up-arrow a n b)
(let loop ((n n) (b b))
(cond ((= b 0) 1)
((= n 1) (expt a b))
(else (loop (- n 1) (loop n (- b 1)))))))
 
(define (A+ m n)
(define (A-stream)
(cons*
(ints-from 1) ;; m = 0
(ints-from 2) ;; m = 1
;; m = 2
(lmap (lambda (n)
(+ (* 2 (+ n 1)) 1))
(ints-from 0))
;; m = 3
(lmap (lambda (n)
(- (knuth-up-arrow 2 (- m 2) (+ n 3)) 3))
(ints-from 0))
;; m = 4...
(delay (ldrop (A-stream) 3))))
(llref (llref (A-stream) m) n))
 
(print "extended version (A 3 6): " (A+ 3 6))
</lang>
{{Out}}
<pre>
simple version (A 3 6): 509
extended version (A 3 6): 509
</pre>
 
=={{header|OOC}}==