河内塔,蟒蛇->方案,显示错误。我缺少什么?

发布于 2024-08-23 12:22:53 字数 786 浏览 1 评论 0原文

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 语句引发了错误,但我不明白为什么会发生这种情况?

The python implementation

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

Gives the right solution for tower of hanoi. But my scheme port,

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

Gives the right solution but in the end throws the following error.

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

I know that its my print statement that is throwing the error, but I can't figure out why is this happening ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

饮湿 2024-08-30 12:22:53
 ((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) ,其中
您收到错误#;参数是:##<无效>

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

The above code doesn't do what you think it does :)

To execute a series of expressions / statements you need something like this:

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

The syntactic sugar in Scheme is

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

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

will be evaluated, and the code seems to work. But as soon as the recursion ends,
the interpreter will try to execute it as (op param1 param2) and there is where
you get the error #<void>; arguments were: #<void> #<void>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文