• 締切済み

ハノイの塔の問題で困っております。

LISPの問題ですが、ハノイのプログラムはここまでできております。 > (defun hanoi (n a b c) (cond ((= n 1) (print (list "move" n "from" a "to" c))) ((> n 1) (hanoi (1- n) a c b) (print (list "move" n "from" a "to" c)) (hanoi (1- n) b a c)))) 実行結果を出すには、どんなプログラムが入力すればよいのでしょうか。 すみませんが、力を貸してください。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>エラーがでます。 どんなエラーがでますか? メッセージを補足して下さい。 例えば、printという関数はありますか? なければ、write に置き換えてみて下さい。

zeroLips
質問者

補足

このようなエラーがでます。 Error: 1 is invalid as a function. Fast links are on: do (si::use-fast-links nil) for debugging Error signalled by COND. Broken at HANOI. Type :H for Help. と表示されます。 原因は分かるでしょうか??

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

(hanoi 3 'a 'b 'c)

zeroLips
質問者

補足

ご回答有難うございます。どうにか実行できました。しかし、エラーがでます。 私がやったプログラムはどこが違うのでしょうか?? すみませんが、よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CommonLispでハノイの塔の円盤の移動回数を数える。

    はじめまして。東吾と言います。 Lispを最近初めて、色々見ながらハノイの塔のプログラムを作ってみました。 それだけじゃ芸が無いから移動の回数を数えてみようとおもったんだけど、行き詰まってしまいました。 idouの出てきた回数を数えれば良いのは分かるんだけどうまく組みこめないんです。 よろしくお願いします。 とりあえず作ってみたハノイの塔のプログラムです。 (defun hanoi (n from to v) (if (= n 1) (idou 1 from to) (let ((n1 (1- n))) (hanoi n1 from v to) (idou n from to) (hanoi n1 v to from)))) (defun idou (n from to) (print `(move ,n from , from to, to)) )

  • ハノイの塔

    次のc言語で書かれたハノイの塔のプログラムをZ80で動作させたいのですが、アセンブルするとどうなるのでしょうか??教えてください。 void move(char n,char a,char b){ if(n>1)move(n-1,a,6-a-b); if(n>1)move(n-1,6-a-b,b); } int main(){ char n=5; move(n,1,2); }

  • javaハノイの塔について

    public class hanoinotou { static void move(int n,int a,int b , int c) { if(n>1) move(n-1,a,c,b); System.out.println("円盤"+n+":"+a+"→"+c); if(n>1) move(n-1,b,a,c);} public static void main(String args[]){ move(3,1,2,3); } } ↑このプログラムの動き方を教えてください よろしくお願いします

  • C言語 ハノイの塔

    #include<stdio.h> void hanoi(int n,char a,char b,char c); int main(void) { int n=3; printf("円板の枚数 ⇒ " ); hanoi(n,'a','b','c'); return 0; } void hanoi(int n,char a,char b,char c) { if(n > 0){ hanoi(n - 1,a,c,b); printf("%d番の板を %c から %c に移動\n",n,a,b); hanoi(n - 1,c,b,a); } } このときの再帰の処理がわかりません。。 再帰の間にprintfがあるのでどこがつながっているのか順番がわかりません。 具体的な数値の手順を教えてください。

  • ハノイの塔

    ★自分が理解している事 「(n-1)ハノイが解けると仮定するとnハノイも解けること」 は理解できます。 そして数学的帰納法によりすべての自然数についてハノイは「解ける」 ここまではわかります。 ★わからないのは、その「解き方」です。 「解ける」ことはわかるのですが「解き方」がわからないのです。 何故このプログラムで正解が表示されるのかが理解できないのです。 確かに、紙と鉛筆でプログラムの流れを追っていくと解けています。 しかし、何でこのプログラムで解けるのかがわからないのです。 棒xは出発点 棒yは目的地 棒zは作業棒 です。 (n-1)ハノイをひとかたまりと考え、作業棒Zに移す。 nハノイを目的地Yに移す。 (n-1)ハノイをひとかたまりと考え、目的地Yに移す。 そんな説明で確かに納得した気になりはします。 しかしこのプログラムでは(n-2)以下の場合についてはいっさい語っていません。 何かだまされてる気がします。 このプログラムでは(n-1)について語っていますが (n-2)以下については全く語っていません。 数学的帰納法により「解ける」ことは証明済みですが、 「その解き方」がこのプログラムでよいという「証明」はありますでしょうか? 理解のコツはありますでしょうか? よろしくお願いいたします。 #include<stdio.h> #include<stdlib.h> void hanoi(int n, char x, char y, char z) { if(n==0) {/* 何もしない */} else { hanoi(n-1,x,z,y); printf("%c->%c,",x,y); hanoi(n-1,z,y,x); } } int main(void) { int num; scanf("%d",&num); hanoi(num,'A','B','C'); return 0; }

  • perl ハノイの塔の解に順番付けする方法

    プログラミング初心者です。 サブルーチンを用いて、ハノイの塔の解を求める課題で詰まっています。 解自体は求めることができたのですが、それぞれの解の順番(輪を移動させる順番)を一緒に表示させよという指示が出ており、この方法がわかりません。 表示順に上から番号を振るという考え方でよろしいのでしょうか。 まず考え方自体が違うようであれば、そこから指摘して頂きたいと思います。 よろしくお願いします。 ちなみに現状ではこのようになっております。 #!/usr/bin/perl sub hanoi { my ($no , $x , $y , $z) = @_; if( $no = $no){ hanoi ($no-1,$x,$z,$y); print "Move", $no ,"from" , "$x" , "to" , "$z" , "\n"; hanoi ($no-1,$y,$x,$z); } } print"入力された枚数のハノイの塔の解(順番付き)\n"; $data=<>*1; hanoi($data , "A" , "B" , "C");

  • ハノイの塔?

    円盤の枚数nをキーボードから入力すると、ハノイの塔の第一軸から第三軸への移動手順を、ファイルに出力するCプログラムを書きたいんですが、よく分かりません、ヒントでもいいのでご指導お願いします。

  • ハノイの塔のプログラムの疑問点

    ハノイの塔のプログラムについて調べていて http://www.kernelthread.com/hanoi/ というサイトを見つけいくつかの言語でのソースを見ていたら、pascalのところで疑問がある箇所がありました。 writeln('move ', Tfrom:1, ' --> ', Tto:1); というところです。実行すると「move1-->3」など円盤の動きがわかりましたが、ここの「 :1 」という記述の意味がわかりません。 ここの意味を教えてください。

  • リストを逆順にする関数(LISP)

    「初めての人のためのLISP[増補改訂版]」のP150のリストを逆順に関数がよくわかりません。 以下がその関数です。 (defun nreverse (x) (nrev2 x nil)) (defun nrev2 (x r) (cond ((null x) r) (t (nrev2 (cdr x) x) (rplacd x r) ))) xがnilになるまで再帰を繰り返し、((null x) r) で再帰を戻りますがなぜs (rplacd x r)でリストが逆順になるんでしょうか。例えばxを(a b c)とすると x:(a b c) r:nil ↓ x:(b c) r:(a b c) ↓ x:(c) r:(b c) ↓ x:nil r:(c) ↓ rplacd (c) (b c) ↓ rplacd (b c) (a b c) ↓ rplacd (a b c) nil となるのですが、これじゃあ全然リストは逆順になりませんよね。 誰が教えてください、お願いします。 ちなみにrplacd は第一引数のcdrを第二引数に変換する関数です。

  • lispに関する質問

    最近lispを勉強し始めたのですが、 Newton法を使った平方根を求めるプログラムがうまく書けず困っています。 (defun isqrt(n &aux x0 x1) (setq x0 (expt 2 (floor (integer-length n) 2))) (loop (setq x1 (floor (+ x0 (floor n x0)) 2)) (print x1) (cond ((= x0 x1)(return)) (t (setq x0 x1)))) x0) このように書くとnの値が3や8や15の時にx0、x1の値が無限に出てきてしまいます。 何でおかしいのでしょうか? 直すにはどうしたら良いですか? わかる方教えて下さい。 よろしくお願いします。