2013-08-03 2 views
3

저는 Scheme을 처음 사용하는데 이것은 매우 기능적인 언어입니다. 재귀 적으로 거의 모든 것을 구현하는 것은 나에게 어색한 것 같다. 그럼에도 불구하고 단일 정수 입력을 갖는 Factorial 및 Fibonacci 문제의 기능을 구현할 수있었습니다.재귀 함수가 스키마에 목록을 받아들입니다.

그러나 함수에 목록이 입력되면 어떨까요? 이 운동을한다고 가정

기능 : ret10 - 목록 모든 숫자로 추출하여 반환 주어진 목록에서 발견되는 이상 10 , 교활>(ret10 '(XE (HN) 1 23 12시)) 출력 : (23 12)

나는이 있으시면이 내 함수의 인수로 (C (목록)을 정의)? 아니면 다른 방법이 있습니까?

도와주세요. 감사! 이 다른 사람을 도움이되기를 바랍니다 .. 아래 여기


은 선생님 오스카르 로페스의 대답에 내 파생 솔루션을 기반으로 :

(define (ret10 lst) 
    (cond 
     ((null? lst) '()) 

     ((and (number? (car lst)) (> (car lst) 10)) 
      (cons (car lst) 
      (ret10 (cdr lst)))) 

     (else (ret10 (cdr lst))) 
    ) 
) 
+0

죄송합니다. 나는 10 이상을 의미했다.죄송합니다. 편집했습니다. –

답변

4

당신이 입력으로 목록을 받아 출력이 같은 다른 목록을 반환 문제는 이런 종류의 솔루션에 대한 잘 알려진 템플릿입니다. The Little Schemer 또는 How to Design Programs을 살펴 보시길 권합니다. 어느 책에서든 해결책에 대해 생각해 볼 수있는 올바른 방법을 가르쳐 드릴 것입니다.

먼저, 비슷한 문제를 해결하는 방법을 설명합니다. 목록을 그대로 복사하는 것입니다. 솔루션의 일반적인 구조를 보여줍니다.

(define (copy lst) 
    (cond ((null? lst)    ; if the input list is empty 
     '())      ; then return the empty list 
     (else      ; otherwise create a new list 
     (cons (car lst)   ; `cons` the first element 
       (copy (cdr lst)))))) ; and advance recursion over rest of list 

위의 내용이 귀하의 문제와 어떤 관련이 있는지 살펴 보겠습니다. 분명히 재귀에 대한 기본 경우는 동일합니다. (다음 number? 절차를 사용 힌트) 10보다 더 큰 무엇 다른 것은 그것이 수 있다면 우리가 목록 의 나머지 부분과 첫 번째 요소를 cons 것입니다. 조건이 만족스럽지 않으면 우리는 아무 것도하지 않고 재귀를 진행합니다.

(define (ret10 lst) 
    (cond (<???> <???>)   ; base case: empty list 
     (<???>     ; if the condition holds 
     (cons <???>   ; `cons` first element 
       (ret10 <???>))) ; and advance recursion 
     (else     ; otherwise 
     (ret10 <???>))))  ; simply advance recursion 

그것을 테스트하는 것을 잊지 마세요 : 여기에 입력 된 공백, 일반적인 생각

(ret10 '(x e (h n) 1 23 12 o)) 
=> '(23 12) 

최종 참고로 : 일반적으로는 filter 절차를 사용하여이 문제를 해결할 것 - 이는 입력으로 주어진리스트를 취해서 주어진 술어를 만족하는 요소들만 가진 다른리스트를 출력으로 리턴한다. "손으로"솔루션을 작성하는 방법을 배우고 이해 한 후에는 filter을보고 다른 방법을 비교하기 위해 솔루션을 작성하십시오.

+1

Whoooaa !!! 오스카에게 감사합니다! 당신은 최고예요. 지금 당장 코드를 발견하고 해답을 얻지 않도록 해 주셔서 감사합니다. hehe. 내가 만든 솔루션을 견디기 위해 내 게시물을 업데이트했습니다. 다른 사람들에게 도움이되기를 바랍니다. –

+0

@ BurnzZ 항상 내 즐거움 :) –

0

목록의 첫 번째 요소와 나머지 목록의 반복에 대한 문제를 해결하십시오. 당신이 종료 조건을 처리해야합니다 (목록 null?이다)와 결합 결과 (다음에 cons 또는 append)

(define (extract pred? list) 
    (if (null? list) 
     '() 
     (let ((head (car list)) 
      (rest (cdr list))) 
     (cond ((pred? head) (cons head (extract pred? rest))) 
       ((list? head) (append (extract pred? head) 
            (extract pred? rest))) 
       (else (extract pred? rest)))))) 

(define (ret10 list) 
    (extract (lambda (x) (and (number? x) (> x 10))) list)) 

> (ret10 '(0 11 (12 2) 13 3)) 
(11 12 13) 
관련 문제