2017-04-15 37 views
0

注意:我正在做这个作业。我不是在寻找算法来解决我的问题,只是想了解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. 
     ) 
    ) 
)) 

我真的在我如何获得价值的损失,一经发现,退了出去,因为它不停地尝试把值作为函数的递归。

+0

[Sylwester's answer](http://stackoverflow.com/a/43430528/7872323)为我修复了它。 –

+1

您不应该手动将问题标记为“[解决]”。通过点击灰色复选标记符号来接受Sylwester的回答,并且问题的微型图标将自动标记为绿色。 – suchtgott

回答

2

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

((if ...)) 

就意味着,从if结果是,一旦该值cmoputed立即要调用的函数。看起来你正在使用括号,就好像它们是块一样,如C中的{},但它们不是。实际上(begin ...)是Scheme中的一个块。当然还有一个功能,letcond方面有隐式开始。因此

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

相同

(define (func . args) 
    x 
    y) 

还请format your code correctly。缩进有助于您阅读代码和嵌套。我真的不注意括号,只是关键的位置。选择一个为你做这个的编辑器。例如。 DrRacket是一个很好的我使用。

+0

非常感谢!这是额外的一组括号,它正在抛弃它。当老师解释课堂上如何使用Parens时,我想我有点被误解了,我把它们和C中的Parens和Curly Braces一样。我会通过这个样式指南,让我的代码变成更好的格式现在。 非常感谢。 –

+1

@ChristopherMayer不客气。我认为了解其他语言会使得学习Scheme变得更加困难,但是这是一门很棒的语言,因为你学会了不同的思维方式,所以你也可以在其他语言中变得更好。如果这个答案帮助你,请考虑[接受答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – Sylwester

相关问题