【问题标题】:Define queue in a function在函数中定义队列
【发布时间】:2016-06-11 01:08:25
【问题描述】:

我正在尝试在我的一个函数中创建一个新队列,但出现错误

define:找到了一个不在顶层的定义

我该如何解决这个问题?我需要在里面的某个地方创建这个队列。我不能只在它之外创建辅助变量。

(define (bfs-graph X G)
  (define q (make-queue))
  (enqueue! q X)
  ... some work with queue
  )

(define (reachable? X Y G)
  (cond
    [(empty? (graph-edges G)) #f]
    [else (bfs-graph X G)]
    )
  )

编辑:

好的,这似乎有效。我将尝试更多地使用代码。谢谢。

(define (reachable? X Y G)
  (let ((q (make-queue)))
    (cond
      [(empty? (graph-edges G)) #f]
      [else (bfs-graph X G q)]
      )
    )
  )


(define (bfs-graph X G q)
  (enqueue! q X)
  )

【问题讨论】:

  • 您想在每次调用bfs-graph 时创建一个新的、不同的队列,还是在不同的`bfs-graph 调用之间重用同一个队列?
  • 现在我想起来了,我要递归地重用 bfs-graph。正如您可能已经猜到的那样,我正在尝试查找给定顶点的所有邻居并将它们放入队列中,因此我希望拥有可以附加新值的相同队列。
  • 那么最好在过程外部创建队列并将其作为参数从开始计算的过程中传递出去。
  • 是的,我想这就足够了。并确保在递归调用中传递队列。
  • 您是否将enqueue! 拼错为!enqueue

标签: scheme racket


【解决方案1】:

您发布的代码应该可以工作,尝试更改语言 - 将其设置为“从源代码确定语言”并在文件开头添加此行:

#lang racket

如果由于某种原因你不能使用不同的语言,这相当于你写的:

(define (bfs-graph X G)
  (let ((q (make-queue)))
    (enqueue! q X)
    ; ... some work with queue
    ))

【讨论】:

  • 我应该说我在 DrRacket 中使用“高级学生”。您的解决方案现在有效,但我有一个问题。我发现我也可以使用 local() 而不是 let。有什么区别?此外,当我一个接一个地输入更多“(enqueue!q 5)”时,它会调用此错误:let: expected only one expression after the bindings, but found 1 extra part
  • 它们或多或少是相同的,请参阅answer 以获取有关local 的更多信息。我宁愿使用let,它是标准方案。您收到的错误肯定是由一些放错的括号引起的,请查看documentation 以确保您正确使用了语法。
  • 您可以使用(local [(define q (make-queue))] (begin (enqueue! q X) .... some work with q ....))
  • 在高级学生语言中,我建议使用local,而不是let。在教学语言中,您应该使用local,因为您可以重复使用define 的现有语法。
  • 我明白了,但是如果我想在我原来的问题中那样跨多种方法使用队列,如果它在本地,那仍然有效吗?我认为本地变量只能从本地访问。
猜你喜欢
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多