注意:我这样做是为了完成家庭作业。我不是在寻找算法来解决我的问题,只是想了解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 :(得分:2)
你的括号已关闭。如果你写
((if ...))
这意味着if
的结果是一个函数,一旦值被cmoputed立即调用。看起来你正在使用括号,好像它们是块一样,比如C中的{}
,但它们不是。实际上(begin ...)
是Scheme中的一个块。当然,一个函数,let
和cond
项隐含开始。因此
(define (func . args)
(begin
x
y))
与
相同(define (func . args)
x
y)
另请format your code correctly。缩进可帮助您阅读代码和嵌套。我真的不注意括号,只关注至关重要的位置。选择一个为您执行此操作的编辑器。例如。我使用DrRacket是一个很好的。