;This is the toh program that uses n pegs to transfer disks from given src to dest (defun toh_n_pegs (src dest aux taken_aux n n_aux n_pegs) ; if number of disks is 1, move the disk from src to dest peg (cond ((= n 1) (print_func src dest) ) ;if the number of aux pegs available is 1, call the 3 pegs toh program ((= n_aux 1) (cond ((listp aux) (toh src dest (car aux) n) ) (t (toh src dest aux n) ) ) ) (t ;if the number of pegs is more than 1, recurse again until number of disks is 1 or number of aux pegs available is 1 (setq loop_cnt n_aux) (cond ((< n n_aux) (setq loop_cnt n) (setq n_aux n) (setq aux (del_aux aux)) ) ) (dotimes (cnt (- n_aux 1) 0) (cond ((listp aux) (setq temp_aux (create_aux_list src (car aux) taken_aux n_pegs)) ) (t (setq temp_aux (create_aux_list src aux taken_aux n_pegs)) ) ) (if (not (listp aux)) (setq aux (cons aux ())) ) (cond ((= cnt 0) (toh_n_pegs src (car aux) temp_aux taken_aux (+ (truncate (/ n n_aux)) (mod n n_aux)) (length temp_aux) n_pegs) ) (t (toh_n_pegs src (car aux) temp_aux taken_aux (truncate (/ n n_aux)) (length temp_aux) n_pegs) ) ) (setq taken_aux (cons (car aux) taken_aux)) (setq aux (cdr aux)) ) (setq temp_aux (create_aux_list src dest taken_aux n_pegs)) (if (not (listp aux)) (setq aux (cons aux ())) ) (toh_n_pegs src dest temp_aux taken_aux (truncate (/ n n_aux)) (length temp_aux) n_pegs) (setq aux taken_aux) (setq new_aux nil) (setq new_aux (create_aux_list (car aux) dest taken_aux n_pegs)) (dotimes (cnt (- n_aux 2) 0) (toh_n_pegs (car aux) dest new_aux taken_aux (truncate (/ n n_aux)) (length new_aux) n_pegs) (setq taken_aux (update_taken_list (car aux) dest taken_aux)) (setq new_aux (cons (car aux) new_aux)) (setq aux (cdr aux)) ) (toh_n_pegs (car aux) dest new_aux taken_aux (+ (truncate (/ n n_aux)) (mod n n_aux)) (length new_aux) n_pegs) (setq taken_aux (update_taken_list (car aux) dest taken_aux)) (setq new_aux (cons (car aux) new_aux)) (setq aux (cdr aux)) ) ) )