2017-04-17 1 views
0

저는 Scheme 및 기능적 프로그래밍을 처음 사용하므로 익숙하지 않아야합니다. ,Scheme : 피벗을 기준으로 요소 정렬

하나를 작거나 같은 피벗에있는 모든 요소에 대한

하나 : 나는 목록 및 피벗을받는 함수를 구현하고 다음이 명 목록을 포함하는 목록을 반환하기 위해 노력하고있어 피봇보다 큰 모든 요소에 대해

define helper (lambda (lst pivot) 
      (define lst1 null) 
      (define lst2 null) 
      (define my-split (lambda (lst pivot lst1 lst2) 
           (if (null? lst) 
            (list lst1 lst2) 
            (if (<= (car lst) pivot) 
             (my-split (cdr lst) pivot (cons (car lst) lst1) lst2)           
             (my-split (cdr lst) pivot lst1 (cons (car lst) lst2))))))         
       (my-split lst pivot lst1 lst2))) 

내 현재의 문제는 lst1lst2가 그래서 문제가 추측 실행의 끝에서 null 있다는 것입니다 : -

그래서 나는 다음과 같은 코드 (문제 해결하고자 수정 됨 (& WORKING) CODE)를 썼다 라인은 (cons (car lst) lst1) & (cons (car lst) lst2)))입니다.

일부 복잡한 명령을 사용하는 웹에서 일부 구현을 보았습니다. 사용하지 못하게되었습니다 (예, 숙제입니다).

직접 제공하는 대신 내 코드를 수정하는 방법을 제공해주십시오.

감사

답변

1

당신은 제대로 주요 문제있는 두 줄을 확인했다. cons은 새 목록을 만들고 반환하지만 변수 lst1lst2을 변경하려고합니다. 이렇게하는 올바른 방법은 (set! lst1 (cons (car lst) lst1))(set! lst2 (cons (car lst) lst2))입니다. 좋은 함수형 프로그래밍 스타일은 돌연변이를 피한다는 것을 명심하십시오. 이 경우에 좋은 방법은 주 목록을 되풀이하면서 두 하위 목록을 인수로 전달한 다음 끝에 도달하면이를 반환하는 것입니다.

+0

내가 언급했듯이, Im은'set! '을 사용할 수 없기 때문에 입력 매개 변수에'lst1'과'lst2'를 추가하고 인수로 전달했지만 결과는 동일합니다 (내 편집 참조). 당신이 제공하는 것에 대한 코드 샘플을 제공 할 수 있습니까? – Noam

+1

@Noam 거의 다 왔어. 마지막 라인에서'if (list lst1 lst2)'를 첫 번째'if' 표현식의 첫 번째 팔로 옮긴다 ('null'을 대체). –

+0

감사합니다. – Noam

1

Java에서 str.concat("hey") 같은 표현식은 변경되지 않습니다. str(cons 1 lst1)이 변경되지 않으므로 lst1은 변경되지 않습니다. 그냥 새로운 값을 반환합니다. 함수의 대부분은 데드 코드로 구성되어 있습니다. 함수 프로그래밍을 배우고 싶다면 바인딩과 객체를 변경하면 한계가 없습니다.

당신은 같은 것을 할 필요가 :

(define (count-odds lst) 
    (define (helper lst odds) 
    (cond ((null? lst) 
      odds) 
      ((odd? (car lst)) 
      (helper (cdr lst) (+ 1 odds))) 
      (else 
      (helper (cdr lst) odds))))  
    (helper lst 0)) 

(count-odds '(1 2 3)) 
; ==> 2 

우리는 odds, 우리는 단지 다음 재귀로 전송됩니다 어떤 업데이트 변경하지 않습니다. Scheme은 꼬리 호출 제거 ​​기능이 있으므로 실제 돌연변이가없는 while 루프에서 변수를 업데이트하는 것과 같습니다.

+0

설명해 주셔서 감사합니다. 귀하의 예를 이해합니다. 그러나 문제를 어떻게 적용 할 지 잘 모르겠습니다. 당신이 말한 것을하려고 노력하지만 내 코드를 편집했지만 결과는 같습니다. 어떤 아이디어? – Noam

+0

'split-at'는'lst1'을 리턴하고'lst2'는 널값으로 다시 끝납니다. 그 결과로'split-at' 결과를 원하기 때문에 제거하고 싶을 것입니다. 널을 반환하는 것이 아니라'lst'의 끝에 도달 할 때'lst1'과'lst2'를 사용하여 무언가를하고 싶을 수도 있습니다. 또한 프로 시저에 정의 된'lst1'과'lst2'는 매개 변수와 관련하여 ** 아무것도 ** 없습니다. 그들은 단지 같은 이름을 가지고 있습니다. – Sylwester