4

Pythonの実装

import sys

def move(src, dst, tmp, num):
    if num == 1: print 'Move from', src, 'to', dst
    else:
        move(src, tmp, dst, num-1)
        move(src, dst, tmp, 1)
        move(tmp, dst, src, num-1)

move('left', 'right', 'middle', int(sys.argv[1]))

ハノイの塔に適切なソリューションを提供します。しかし、私のスキームポート、

(define move
    (lambda (src dst tmp num)
      (if (= num 1) (printf "Move from ~s to ~s \n" src dst)
          ((move src tmp dst (- num 1))
           (move src dst tmp 1)
           (move tmp dst src (- num 1))))))

正しい解決策を提供しますが、最終的には次のエラーがスローされます。

procedure application: expected procedure, given: #<void>; arguments were: #<void> #<void>

エラーをスローしているのは私のprintステートメントですが、なぜこれが発生しているのか理解できません。

4

1 に答える 1

4
 ((move src tmp dst (- num 1))
  (move src dst tmp 1)
  (move tmp dst src (- num 1)))

上記のコードは、あなたが思っていることをしません:)

一連の式/ステートメントを実行するには、次のようなものが必要です。

((λ ()
  (move src tmp dst (- num 1))
  (move src dst tmp 1)
  (move tmp dst src (- num 1))))

Schemeの構文糖衣

(begin
   (move ...)
   (move ...)
   (move ...)
   ...)

((move ...) (move ...) (move ...))

評価され、コードは機能しているようです。しかし、再帰が終了するとすぐに
、インタープリターはそれを実行しようとし 、エラーが発生する (op param1 param2)場所があります
#<void>; arguments were: #<void> #<void>

于 2010-03-01T14:15:01.343 に答える