2017-04-15 71 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

相關問題