2017-09-27 19 views
3

형성 : 다음내가 DrRacket을 사용하고하고 구조체로 정의 DrRacket (또는 제도)에서이 형식의 나무 그래서

(define-struct thing (a b)) 

을, 내가 가진이 형식의 예 나무 :

(define v (make-thing 
       (make-thing (make-thing 1 2) 
          (make-thing 3 4)) 
       (make-thing (make-thing 5 6) 
          (make-thing 7 8)))) 

2의 거듭 제곱 인 양수가 아닌 함수를 작성해야합니다 (1,2,4,8,16 ...과 같음). 숫자 1을 출력합니다 (n = 1 인 경우).) 또는 위와 같은 형식으로 '물건'을 만듭니다.

은 지금까지 나는 많은 방법을 시도했지만 나도 같은 일을 그만 둘 : 내가 제대로 변수를 증가하는 방법을 알아낼 수 없습니다

(make-thing (make-thing (make-thing 1 1) 
         (make-thing 1 1)) 
      (make-thing (make-thing 1 1) 
         (make-thing 1 1)))) 

- 나는 방법을 알아낼 수있었습니다 make-thing의 필요한 수를 적용

(define (helper pow current) 
    (cond 
    ((= pow 0) 1) 
    (else (make-thing 
      (helper (- pow 1) current) 
      (helper (- pow 1) (- current 1)))))) 

(define current 1) 

(define (build-thing-or-number n) 
    (cond 
    ((= n 1) 1) 
    (else (make-thing 
      (helper (- (log n 2) 1) current) 
      (helper (- (log n 2) 1) (add1 current)))))) 

답변

3

build-thing-or-number으로 전화를 걸 수 있도록 허용하려면 입력 할 필요가 거의 없습니다.

는 그래서 우리는 우리가 더 많은 매개 변수를 가지고 있다면이해야 할 훨씬 쉬울 거라고 볼

(g 1) = 1     ; you've got this covered already 
(g 2) = (thing 1 2) 
(g 4) = (thing (thing 1 2) (thing 3 4)) 
(g 8) = (thing (thing (thing 1 2) (thing 3 4))  ; 1..4 
        (thing (thing 5 6) (thing 7 8)))  ; 5..8 

원하는 :

(define (h a b)      ; from ... to 
    (cond 
    ((= (+ a 1) b)     ; like (h 1 2): 
     (make-thing a b))    ; just make the thing 
    (else        ; e.g. (h 1 4) (h 5 8) 
     (let ([c (/ (+ a b -1) 2)]) ;  c = 2  c = 6 
      (make-thing     ; c is the middle 
       (h a c)    ; make the first half 1..2 1..4 
       (h .....))))))  ; and the second  3..4 5..8 

을 그리고 우리는

(define (g b) 
    (cond ((= b 1) 1) 
     (else (h .....)))) 
단순히 사용

그게 바로!

+0

설명 주셔서 감사합니다! 이것은 잘 동작했다. – abcd

2
#lang racket 

(define-struct thing (a b) #:transparent) 
: 여기

내가 지금 사용하는 코드입니다

나는

(define (helper level max) 
    (if (equal? (/ level 2) 1) 
     (make-thing (- max 1) max) 
     (make-thing (helper (/ level 2) (- max (/ level 2))) (helper (/ level 2) max)))) 

최대는 동일한의 일을 간단한에서 가장 높은 번호 (가장 낮은 값을 읽을)되어 현재 일 수준에서 가장 높은 수와 동일 검증의 용이성을 위해, 일이 투명 정의한 모양 (ie (일 (일 5 6) (일 7 8)) 도우미가 모든 작업을 수행, (8)의 최대 4 수준)

(define (build-thing-or-number n) 
    (cond 
    ((= n 1) 1) 
    (else (helper n n)))) 

당신이 볼 수 있습니다.

+0

완벽하게 작동합니다. Upvoted! – abcd

+0

투명감있는 촉감이 좋은. –