2016-11-15 39 views
0

我有要求使用遞歸過程返回列表中的最後一個負數。現在我有一個遞歸過程返回列表中的所有負數。如何使用方案去除列表中的最後一個元素

(define returnLastNeg 
    (lambda (lst) 
    (if (null? lst) 
     '() 
     (if (positive? (car lst)) 
      (returnLastNeg (cdr lst)) 
      (cons (car lst) (returnLastNeg (cdr lst))))))) 

(returnLastNeg'(1 -2 -3 4 -5 6))回報

稱之爲

輸出:

'(-2 -3 -5) 

我需要它來只返回-5雖然。我試圖修改我的程序來檢查列表中最後一個元素是否爲正值。如果是,我想刪除最後一個元素,然後再次調用該過程。但是,當我這樣做,我得到一個錯誤(如下圖)

修改過程:

(define returnLastNeg-modified 
    (lambda (lst) 
    (if (null? lst) 
     '() 
     (if (positive? (last lst)) 
      (remove (last lst) (lst)) 
      (cons (car lst) (returnLastNeg-modified (cdr lst))))))) 

錯誤:

application: not a procedure; 
expected a procedure that can be applied to arguments 
    given: '(1 -2 -3 4 -5 6) 
    arguments...: [none] 
> 
+0

鑑於您似乎在使用Racket,您可以隨時使用['drop-right'](http://docs.racket-lang.org/reference/pairs.html#%28def._%28% 28lib._racket%2Flist..rkt%29._drop-right%29%29)from'racket/list'。 –

+0

@AlexisKing給了我同樣的錯誤 – mdo123

+0

如果'lst'是一個列表,所以'(last lst)'工作如何是一個悖論,你在你的代碼中除了清晰的參數列表外還有'(lst)'似乎試圖運行'lst'就好像它對一個過程進行了評估。 'lst'不能既是一個程序又是一個列表,所以他們中的一個將會失敗。 – Sylwester

回答

0

一個簡單的方法是用一個輔助程序(稱爲「子「)在本例中:

(define returnLastNeg 
    (lambda (lst) 
    (define sub 
     (lambda (lst last-neg) 
     (if (null? lst) 
      last-neg 
      (let ((c (car lst))) 
       (sub (cdr lst) 
        (if (negative? c) c last-neg)))))) 
    (sub lst null))) 

編輯

明知

(define <procedureName> (lambda (<params>) ...) 

相同

(define (<procedureName> <params>) ...) 

,並重新格式化了一下,這成爲:

(define (returnLastNeg lst) 

    (define (sub lst last-neg) 
    (if (null? lst) 
     last-neg 
     (let ((c (car lst))) 
      (sub (cdr lst) (if (negative? c) c last-neg))))) 

    (sub lst null)) 

我希望這是更清晰

  • last-neg得到通過的最後表達
  • 遞歸調用設置nullsub有2個參數(2線最初版本分裂,但換行並不重要)。

這是與使用所謂的「命名讓利」的更短版本

(define (returnLastNeg lst) 
    (let sub ((lst lst) (last-neg null)) 
    (if (null? lst) 
     last-neg 
     (let ((c (car lst))) 
      (sub (cdr lst) (if (negative? c) c last-neg)))))) 

+0

你的答案似乎是最短的。但對我而言,理解並不容易。你能走過我嗎?我有點困惑如何設置最後一個neg,以及爲什麼你在底部定義了(sub lst null),以及爲什麼你要爲子進程中的lambda過程定義兩個參數,但是隻傳遞一個參數(cdr list)當你打電話給子? – mdo123

相關問題