2016-10-25 44 views
0

所以最近我學習了遞歸函數,我在嘗試一些練習,然後我只是卡住了。在使用球拍初學者語言編寫遞歸函數時遇到困難?

問題是 列表第n個項,消耗的列表,(LST),和一個自然數,(n),並且如果存在 產生在LST的第n個元素,否則函數產生假。注意 ,第一項是在索引0。例如:(list-nth-item (list 1 2 3) 0)產生1

這是我的代碼

 ;;list-nth-item consumes list and a natural number 
    ;;and produces the n-th element in the list or false 
    ;;list-nth-item: List Nat -> (Anyof Any false) 
    (define (list-nth-item lst n) 
      (cond 
      [(empty? lst)false] 
      [(= n 0)(first lst)] 
      [else ????])) 


     (list-nth-item (list 1 2 3)2)--> should produce 3 

因而我知道是不是適當的遞歸,同樣當n = 0時,應該首先產生列表示例中的數字(list-nth-item (list 1 2 3)0)應該給1。 我是新來的,只是沒有得到如何形成遞歸。

回答

1

將列表視爲傳送帶:您檢查您是否到達了您的物品(使用第一種情況(= n 0)),如果沒有(else),則只需通過列表的尾部移動皮帶(使用cdr函數)並再次重複該過程。

這是可以做到像以下:

(define (list-nth-item lst n) 
    (cond 
    [(empty? lst) #f] 
    [(zero? n) (car lst)] 
    [else (list-nth-item  ; <-- repeats the process 
      (cdr lst)   ; <-- shifts the "belt" 
      (sub1 n))]))  ; <-- updates the number of steps to go 

PS:這個已經被list-ref函數來完成。