;; Programming Praxis ;; http://programmingpraxis.com/2009/02/19/flavius-josephus ;; Flavius Josephus ;; Written in Scheme (Guile 2.0) ;; (josephus 41 3) -> ;; (2 5 8 11 14 17 20 23 26 29 32 35 38 0 4 9 13 18 22 27 31 36 40 6 12 19 25 ;; 33 39 7 16 28 37 10 24 1 21 3 34 15 30) (define (josephus n m) (let loop ((s (apply circular-list (iota n))) (n n) (res '())) (if (= 1 n) (reverse (cons (car s) res)) (let* ((x (drop s (- m 2))) ;; element preceding the element to remove (y (cadr x))) ;; element to remove (set-cdr! x (cddr x)) ;; remove element from circular list (loop (cdr x) (1- n) (cons y res))))))