Ханойская башня, python -> схема, показывает ошибку. Что мне не хватает? - PullRequest
4 голосов
/ 01 марта 2010

Реализация 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>

Я знаю, что это мой оператор печати, который выдает ошибку, но я не могу понять, почему это происходит?

1 Ответ

4 голосов
/ 01 марта 2010
 ((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))))

Синтаксический сахар в схеме

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

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

будет оцениваться, и код, кажется, работает. Но как только рекурсия заканчивается,
интерпретатор попытается выполнить его как (op param1 param2) и там, где
вы получаете ошибку #<void>; arguments were: #<void> #<void>

...