2016-10-25 1 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 기능에 의해 수행된다.