2012-11-09 1 views
1

저는 Scheme에서이 프로그램을 구현하는 데 어려움을 겪고 있습니다. 불행히도 숙제가 있기 때문에 약간 애매해야합니다.Scheme에서 하나의 진정한 가치 반환하기

입력으로 하나의 목록을 가져와 목록의 가능한 모든 하위 시퀀스를 생성하고 특정 조건과 일치하는 하나를 반환해야합니다. 필자는 목록의 모든 하위 시퀀스를 생성하고 특정 하위 집합이 솔루션인지 여부를 알려주는 코드를 완성했습니다. 그러나 나는 그 해결책을 반환하는 데 어려움을 겪고있다. 내 코드는 기본적으로 지금처럼 보입니다.

(define (function rest_of_list subsequence) 
    (if (subsequence is a solution) subsequence) 
    (if (> (length rest_of_list) 0) (function (cdr rest_of_list) (append subsequence (car rest_of_list)))) 
    (if (> (length rest_of_list) 0) (function (cdr rest_of_list) subsequence))) 

이 코드는 목록의 각 요소에 대해 수행해야하는 것이 재귀 적으로 두 방향으로 분기됩니다. 한 방향으로 하위 순서에 (car rest_of_list)를 추가하고 목록을 계속합니다. 다른 방향에서 그것은 (자동차 rest_of_list) 무시하고 목록을 계속합니다. 받아 들일 수있는 서브 시퀀스를 찾자 마자 함수는 그것을 반환하고 함수라는 함수의 결과입니다. 지금 나는 빈 출력 만 얻는다. 그리고 나는 왜 그런지 추측하지만, 이것을 고칠 정도로는 이해하지 못합니다.

답변

1

그것은 구현의 정확한 세부 사항을보고하지 않고 조금 어려운,하지만 나는이 라인을 따라 뭔가 할 거라고 :

(define (function rest_of_list subsequence) 
    (cond ((null? rest_of_list) 
     '()) 
     ((subsequence is a solution) 
     subsequence) 
     (else 
     (combine (function (cdr rest_of_list) (append subsequence (car rest_of_list))) 
        (function (cdr rest_of_list) subsequence))))) 

흥미로운 부분은 당신 combine 두 가지, 그것은 간단하게 할 수있는 방법입니다 cons으로 또한 기본 케이스가 빠져있는 것을 볼 수 있습니다 : 나머지리스트가 null 일 경우 어떻게됩니까?

+1

이것은 분명히 내가 뭘 잘못하고 있는지 알 수있었습니다. 내가 지금 고칠 것 같아. 순차적 절차가 프로 시저 언어처럼 진실을 반환하자마자 반환 할 Scheme을 기대하기보다는 재귀 분기가 유효한 대답으로 이끄는 재귀의 각 단계를 명시 적으로 정의해야합니다 (또는 둘 다 선택하십시오). – Outback