2017-01-21 3 views
-1

라켓을 처음 사용합니다. 1000 이하 (또는 n 번째 값) 미만의 모든 자연수를 합산해야하며 숫자는 3 또는 5로 나눌 수 있습니다. 반복을 사용하여이를 수행 할 수있는 코드가 있습니다. 하지만 재귀를 통해 같은 일을해야합니다. 코드는 다음과 같습니다 :재귀에 의한 시리즈의 라켓 조건부 합

같은 일을해야하지만 재귀가 있지만 루프 나 반복은 필요하지 않습니다.

답변

1

루프의 각 반복을 함수 호출로 시각화하는 한 이것은 간단합니다. 그것에 대해 생각해보십시오 : 원래 for 루프는 1부터 limit-1까지 올라갑니다. 이는 limit-1부터 시작하여 각 함수 호출시 한도를 1 줄이고 0에 도달하면 중지합니다. 원 총리는 재귀 절차를 작성 기억해야 할 중요한 두 가지가 있습니다

: 우리는 우리가 어떤 시점에서 중단 있는지 확인해야합니다

  1. -이는 기본 케이스라고; 이 예에서는 0에 도달하면 (원래 루프에 1이 포함되어 있기 때문에) 발생합니다. 우리는 에있는
  2. 우리가 재귀를 호출 할 때 함께 얻을 부분 결과를 결합 : 현재의 수는 우리가 재귀 호출의 나머지 부분에 추가 3 또는 5으로 나눌 수 일어나는 경우, 그렇지 않으면 우리는 그것을 무시하지만, 어쨌든 우리가 기본 케이스에 도달 할 때까지 재귀를 계속 진행하십시오.

이가 무슨 뜻입니다 :

(define (sum-divisibles limit) 
    (cond ((= limit 0) 0)        ; base case, stop recursion 
     ((or (divides? limit 3) (divides? limit 5)) ; does the condition hold? 
     (+ limit         ; then we add current value 
      (sum-divisibles (- limit 1))))   ; and advance the recursion 
     (else          ; otherwise skip it 
     (sum-divisibles (- limit 1)))))   ; and advance the recursion 

는, 초기 limit 값에주의 limit이 합계에 추가되지되어 원래의 코드에서 그 기억 (반복 오른쪽에 도달하기 전에 중지

(sum-divisibles (- n 1)) 

예를 들어,같은 값을 얻었다 : 그것은), 재귀 버전을 호출하기 때문에, 해당 방법은 이것이 코드와, 우리는 재귀 버전에서 다음과 같이 호출 할 수 있습니다

(sum-divisibles 49) 
=> 543 

는 다른 방법이 실제 재귀 프로 시저를 호출하기 전에 하나의 입력 limit을 감소 돌봐 도우미 절차를 쓸 수 있지만, 그건 독자를위한 운동으로 남겨 두었다.

+0

@DataPoliceInc합니다. 이 질문이나 다른 답변이 귀하의 질문을 해결 했습니까? 그렇다면 포스터를 격려하기 위해 최선의 대답을 수락하거나 upvote하는 것을 잊지 마십시오;) –

+0

안녕하세요, Oskar. 설명 해줘서 고마워. 이제는 나에게 매우 명확하고 모든 것을 이해합니다. 이제 (N-1) 사례에 대한 도우미 함수를 만들려고합니다. – DataPsycho

1

n은 양수 여야하고 m은 전임자 인 m = n - 1입니다.

(sum-divisibles m)이 어떤 값인 s과 같다고 가정 해 보겠습니다. (sum-divisible n)을 어떻게 계산 하시겠습니까?

값이 n이고 값이 s 인 함수를 작성하고 n의 합계를 계산하십시오.

(define (recur n s) ...) 

그럼 당신은 limit의 용어와 limit - 1에 대한 sum-divisibles의 재귀 응용 프로그램에서 sum-divisibles을 정의 할 수 있습니다. limit이 0 일 때 재귀의 기본 경우도 처리해야합니다.

1

하나는 재귀를 위해 '라는 이름하자'를 사용할 수 있습니다

(define limit 1000) 

(let loop ((n 1)     ; starting values 
      (sum 0)) 
    (cond 
    [(> n limit) sum]   ; print out sum if limit reached; 

    [(or (= 0 (modulo n 3))  ; if n is divisible by 3 or 5 
     (= 0 (modulo n 5))) 
    (loop (add1 n) (+ sum n))] ; add this number to sum and loop again with next number 

    [else      ; if not divisible 
    (loop (add1 n) sum)]  ; loop with next number without adding to sum 
    )) 
+0

안녕하세요, 대단히 감사합니다. 이제는 나에게 매우 분명하다. – DataPsycho