2013-03-13 2 views
1

저는 Scheme을 처음 접했고 오늘 해결할 수없는 다음 문제를 발견했습니다. 나는 파일 시스템을 나타내는 트리의 노드에 대한 다음과 같은 표현이 있습니다경로 찾기 스키마

(디렉토리 이름 함량) 디렉토리를 빈 디렉토리 예를 들어

("에 대한 파일
(디렉토리 이름 널 (null))에 대한
FILE_NAME etc/"(("network/"("interfaces ")))) 경로 etc/network/interfaces에 대한 트리입니다.

내가해야 할 일은 이런 종류의 트리와 디렉토리/파일 이름을 인수로 취하고 거기에 경로가있는 경우 그 경로를 반환하는 함수를 작성하는 것입니다. 디렉토리/파일이 없으면 #f를 반환합니다. 예를 들어

: 함수의 이름을 가정 할

(define tree '("/" 
       (("etc/" ("network/" ("interfaces"))) 
       ("root/" null)))) 

얻을 경로를 (취득 경로 트리 "인터페이스")를 실행하여이 출력됩니다 "을/etc/네트워크/인터페이스"입니다.

내가 원했던 것은 생각이었습니다. 당신이 저에게 하나 줄 수 있다면, 나는 감사 할 것입니다.

+1

가 깊이 첫 번째 검색 작업을 수행합니다. 나는. 데이터 구조의 첫 번째 요소가 검색 대상인 경우 반환하십시오. 그렇지 않으면 각 자식을 차례로 (재귀 적으로) 검색하십시오. –

+1

어떻게 여러 경로를 처리 하시겠습니까? 그것은 '인터페이스'가/dev/interfaces,/etc/interfaces와 같은 여러 경로에 여러 번 존재할 수 있다는 것입니다. – GoZoner

+0

@GoZoner 여러 경로를 가질 수 있다는 문제가 명시되지 않았으므로 다중 경로가 없다고 가정합니다. – pixie

답변

0

다음은 답변입니다. 디렉토리/파일에 문자열이 아닌 기호를 사용하고 트리 형식을 약간 변경했습니다. 어떤 결과

(define tree '(root (etc (passwd) (profile)) (usr (bin) (lib)))) 

(define (get-path tree name) 
    (define (reverse-if l) (and l (reverse l))) 
    (reverse-if 
    (let descending ((tree tree) (path '())) 
    (and (not (null? tree)) 
      (let ((root (car tree)) 
       (subs (cdr tree))) 
      (if (eq? root name) 
       (cons root path) 
       (let looking ((subs subs)) 
        (and (not (null? subs)) 
         (or (descending (car subs) (cons root path)) 
          (looking (cdr subs))))))))))) 

:

> (get-path tree 'etc) 
(root etc) 
> (get-path tree 'bin) 
(root usr bin) 
> (get-path tree 'profile) 
(root etc profile) 
> (get-path tree 'foo) 
#f 
>