我今天在计划中编写了以下代码,但评估错误。请不要告诉我我很喜欢编程,我知道这是一个经典的递归问题,但是我遇到了麻烦:
(define (towers-of-hanoi n source temp dest)
(if (= n 1)
(begin (display "Move the disk from ")
(display source)
(display " to " )
(display dest)
(newline))
(begin (towers-of-hanoi (- n 1) source temp dest)
(display "Move the disk from ")
(display source)
(display " to ")
(display dest)
(newline)
(towers-of-hanoi(- n 1) temp source dest))))
我希望代码可以工作,当我调试它时,我只是更加困惑自己。任何人都可以帮助我吗?
答案 0 :(得分:4)
在您的代码中,最后一次递归调用似乎是错误的,并且过程参数的顺序存在问题。试试这个:
(define (towers-of-hanoi n source dest temp)
(if (= n 1)
(begin
(display "Move the disk from ")
(display source)
(display " to " )
(display dest)
(newline))
(begin
(towers-of-hanoi (- n 1) source temp dest)
(display "Move the disk from ")
(display source)
(display " to ")
(display dest)
(newline)
(towers-of-hanoi (- n 1) temp dest source))))
我注意到你一直在问问题标记为racket
,对于Racket来说,这是相同代码的更惯用和更短版本:
(define (towers-of-hanoi n source dest temp)
(cond [(= n 1)
(printf "Move the disk from ~a to ~a~n" source dest)]
[else
(towers-of-hanoi (sub1 n) source temp dest)
(printf "Move the disk from ~a to ~a~n" source dest)
(towers-of-hanoi (sub1 n) temp dest source)]))
无论哪种方式,它都按预期工作:
(towers-of-hanoi 3 "source" "dest" "temp")
Move the disk from source to dest
Move the disk from source to temp
Move the disk from dest to temp
Move the disk from source to dest
Move the disk from temp to source
Move the disk from temp to dest
Move the disk from source to dest