The algorithm, as Daniel answers , has been translated into Haskell with some settings:
longest_sub xs = g2 xs [] 0 where g2 [] a _ = a g2 (x:t) ai | even x = g2 tai | otherwise = g4 t [x] 1 where g4 [] bj = if j>i then reverse b else reverse a g4 xs@ (x:t) bj | even x || x >= head b = if j>i then g2 xs bj else g2 xs ai | otherwise = g4 t (x:b) (j+1)
In general, Lisp:
(defun longest (xs) (prog ((a nil) (i 0) bjx) ; var decls G2 (if (null xs) (return (reverse a))) ; code (setf x (car xs) xs (cdr xs)) (if (evenp x) (go G2)) G3 (setf b (list x) j 1) G4 (if (null xs) (if (> ji) (return (reverse b)) (return (reverse a)))) (setf x (car xs) xs (cdr xs)) (when (evenp x) (if (> ji) (setf abij)) (go G2)) (when (>= x (car b)) (if (> ji) (setf abij)) (go G3)) (setf b (cons xb) j (+ j 1)) (go G4)))
A function call is an illustrious GOTO after all, isn't it?
see also: prog doc page .
source share