2012-10-23 2 views
0

foldr에 대한 단일 호출로만 목록을 역전시키는 함수를 어떻게 정의 할 수 있습니까?foldr을 사용하여 목록 반전

그것은이

(define (rev l) 
    (foldr ___________________________ 

이 같아야은 교사가 -.-

+0

우리는 귀하가 완전한 해결책을 찾기 위해 커뮤니티에 요청하지 않고 직접이 문제를 해결하려고 시도했다고 생각합니다. 비록 당신이 어떤 노력을했는지 우리에게 보여주기위한 몇 가지 코드가있다면 (틀린 경우 라 할지라도) 질문과 국기를 다시 열어 다시 열어주십시오. 감사. – Kev

+1

이 선생님은 아나 밀라노 바가 아니 었습니까? –

+0

네, 그렇습니다;) – Outback

답변

1

당신이 documentation 처음 읽는다면 그것은 슈퍼 쉽게에 대한 답변을 제공하지 않기로 결정하는 연습 시험 문제이며, . (순서대로) 매개 변수로 수신 호출 할

  • 프로시 입력 목록과 축적 된 답변을 지금까지
  • 에서 처리되고있는 현재 요소를 : 당신은 foldr은 세 개의 매개 변수를받는 것을 발견 할 것이다

을 처리하기 위해 초기 값

  • 목록은 이제 잠시 동안 그것에 대해 생각합니다. 새로운 목록을 처음부터 새로 만들려면 초기 값은 무엇입니까? 그리고 우리는 어떻게 목록을 구성 할 것인데, 어떤 절차가 요소들을 고집하기 위해 사용될 수 있는가? 물론 마지막 매개 변수는 입력 목록입니다.

    유일한 까다로운 부분은 절차를 정의하는 것입니다. 지금까지 요소와 누적 된 응답을받은 것을 감안할 때, 어떻게 그 요소를 누적 기의 끝에 넣을 수 있습니까? 힌트 :

    (lambda (element accumulator) <???>) 
    

    추가 힌트 : 문서를 읽고, 당신이 이해할 수있을에서 foldr 프로세스 입력 목록이 왼쪽에서 오른쪽이 채우기에 누락 된 부분, 절차의 일반적인 구조입니다. 이를 확인하려면 cons을 첫 번째 매개 변수로 foldr에 전달하면 입력 목록을있는 그대로 복사합니다. 이 목록을 오른쪽에서 왼쪽으로 처리하는 것으로 보이는 foldl과 대조하십시오. cons을 첫 번째 매개 변수로 foldl에 전달하면 새로 생성 된 목록이 반전됩니다.

  • +0

    왼쪽과 오른쪽이 섞여 있다고 생각합니다. 'foldl'을 사용하여 reverse를 구현하는 것은 간단하지만'foldr'로 구현하는 것은 쉽지 않습니다. –

    +0

    @ ChrisJester-Young 아니요, 혼합되지 않았습니다. 그것이 OP의 연습 문제입니다. - 인위적이고 비효율적이지만 올바른 목록 절차를 사용하는 것은 어렵지 않습니다. –