|
ToDo:
|
Common Lisp
(defun hanoi(n a b c)
(cond ((> n 0)(hanoi (1- n) a c b)(print (format t "from ~A to ~A" a b))(hanoi (1- n) c b a))))
Scheme
(define (hanoi n a b c)
(if (> n 0)
(begin
(hanoi (- n 1) a c b)
(print (format "from ~A to ~A" a b))
(hanoi (- n 1) c b a))))
#include <stdio.h>
#include <stdlib.h>
int main(int,char**);
void func(int,char*,char*,char*);
int main(int argc,char** argv){
if ( argc != 5 ){
printf ("error %d\n",argc);
return 1;
}
func(atoi(argv[1]),argv[2],argv[3],argv[4]);
return 0;
}
void func(int count,char* a,char* b,char* c){
if ( count > 0){
func(count -1,a,c,b);
printf ("from %s to %s\n",a,b);
func(count -1,c,b,a);
}
}
def hanoi(n,a,b,c):
if n > 0 :
hanoi((n-1),a,c,b)
print "from %s to %s" % (a, b)
hanoi((n-1),c,b,a)
if __name__ == "__main__":
hanoi( 3, "a", "b", "c")
let rec hanoi n pags =
if n > 0 then
match pags with
| p1::p2::p3::rest when rest.IsEmpty ->
hanoi (n - 1) (p1::p3::p2::rest)
printfn "%A -> %A" p1 p2
hanoi (n - 1) (p3::p2::p1::rest)
| _ -> failwith "3point needs"
hanoi 3 ["a";"b";"c"] |> ignore
(defn hanoi[n a b c]
(if (> n 0)
(do
(hanoi (dec n) a c b)
(println "from " a " to " b)
(recur (dec n) c b a))))
このところずーっとLispをお勉強中です。再帰に関してはHanoiの塔のLogicのようにSimplifyして考えられるようになっておきたいと思いながら帰宅しました。
この証明ってムズいですね。帰納法になるのかな。