【问题标题】:Returning smallest item in a list in Scheme返回Scheme列表中的最小项目
【发布时间】:2017-04-16 18:21:19
【问题描述】:

注意:我这样做是为了做作业。我不是在寻找解决问题的算法,只是想了解 Scheme 的工作原理。

我是计划的新手,正在尝试编写一个小程序来查找列表中的最小项目。该程序正在运行,因为它正在找到正确的答案(所以逻辑有点合理),但我只知道这一点,因为出现了一个错误,它试图将我的答案视为一个函数并调用它。

(DEFINE (startmin mylist)
(

    (repeatmin (CAR mylist) (CDR mylist))


))


(DEFINE (repeatmin curmin mylist)
(

    (IF (NULL? mylist) ;If the list is empty

        ;This is where I'm at a loss. I want a way for this value to be
        ;sent out once the list is empty
        curmin ;return the current minimum

        (IF (< curmin (CAR mylist)) ;if the current minimum is less than the head of the list
            (repeatmin curmin (CDR mylist)) ;recurse with curmin
            (repeatmin (CAR mylist) (CDR mylist)) ;otherwise recurse with the head of the list.
        )
    )
))

我真的不知道如何获得该值,一旦找到,就退出递归,因为它一直试图将值视为一个函数。

【问题讨论】:

  • Sylwester's answer 为我修复了它。
  • 您不应手动将您的问题标记为“[已解决]”。单击灰色复选标记符号接受 Sylwester 的答案,问题的缩影将自动标记为绿色。

标签: list recursion scheme


【解决方案1】:

您的括号已关闭。如果你写

((if ...))

这意味着来自if 的结果是一个函数,一旦计算出值,就应该立即调用它。似乎您正在使用括号,就好像它们是块一样,例如 C 中的 {},但事实并非如此。事实上(begin ...) 是Scheme 中的一个块。当然还有一个函数,letcond 术语有隐含的开始.. 因此

(define (func . args)
  (begin 
    x
    y))

一样
(define (func . args)
  x
  y)

也请format your code correctly。缩进帮助你阅读代码和嵌套。我真的不注意括号,只注意至关重要的位置。选择一个为您执行此操作的编辑器。例如。 DrRacket 是我使用的一个不错的选择。

【讨论】:

  • 非常感谢!是额外的一组括号把它扔掉了。我想当老师解释如何在课堂上使用 Parens 时我有点误解了,我认为它们与 C 中的 Parens 和花括号相同。我将阅读该样式指南并将我的代码转换为更好的格式现在。再次,非常感谢。
  • @ChristopherMayer 不客气。我认为了解其他语言会使学习 Scheme 变得更加困难,但它是一门很棒的语言,而且你可能会在你所知道的其他语言中变得更好,因为你学会了以不同的方式思考。如果这个答案对您有帮助,请考虑accepting the answer
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多