2010-03-01 16 views
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> 

我知道我的打印語句是拋出錯誤,但我不明白爲什麼會發生這種情況?

回答

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)))) 

語法糖 in Scheme is

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

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

將被評估,代碼似乎工作。但只要遞歸結束,
解釋器將嘗試執行它(op param1 param2)並且存在
你的錯誤#<void>; arguments were: #<void> #<void>

+1

句法糖'(開始(移動...)(移動.. 。)...) – 2010-03-01 14:31:14

+0

謝謝Nathan。 – 2010-03-01 14:36:44