라켓을 처음 사용합니다. 1000 이하 (또는 n 번째 값) 미만의 모든 자연수를 합산해야하며 숫자는 3 또는 5로 나눌 수 있습니다. 반복을 사용하여이를 수행 할 수있는 코드가 있습니다. 하지만 재귀를 통해 같은 일을해야합니다. 코드는 다음과 같습니다 :재귀에 의한 시리즈의 라켓 조건부 합
같은 일을해야하지만 재귀가 있지만 루프 나 반복은 필요하지 않습니다.
라켓을 처음 사용합니다. 1000 이하 (또는 n 번째 값) 미만의 모든 자연수를 합산해야하며 숫자는 3 또는 5로 나눌 수 있습니다. 반복을 사용하여이를 수행 할 수있는 코드가 있습니다. 하지만 재귀를 통해 같은 일을해야합니다. 코드는 다음과 같습니다 :재귀에 의한 시리즈의 라켓 조건부 합
같은 일을해야하지만 재귀가 있지만 루프 나 반복은 필요하지 않습니다.
루프의 각 반복을 함수 호출로 시각화하는 한 이것은 간단합니다. 그것에 대해 생각해보십시오 : 원래 for
루프는 1
부터 limit-1
까지 올라갑니다. 이는 limit-1
부터 시작하여 각 함수 호출시 한도를 1
줄이고 0
에 도달하면 중지합니다. 원 총리는 재귀 절차를 작성 기억해야 할 중요한 두 가지가 있습니다
: 우리는 우리가 어떤 시점에서 중단 있는지 확인해야합니다
0
에 도달하면 (원래 루프에 1
이 포함되어 있기 때문에) 발생합니다. 우리는 에있는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
을 감소 돌봐 도우미 절차를 쓸 수 있지만, 그건 독자를위한 운동으로 남겨 두었다.
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 일 때 재귀의 기본 경우도 처리해야합니다.
하나는 재귀를 위해 '라는 이름하자'를 사용할 수 있습니다
(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
))
안녕하세요, 대단히 감사합니다. 이제는 나에게 매우 분명하다. – DataPsycho
@DataPoliceInc합니다. 이 질문이나 다른 답변이 귀하의 질문을 해결 했습니까? 그렇다면 포스터를 격려하기 위해 최선의 대답을 수락하거나 upvote하는 것을 잊지 마십시오;) –
안녕하세요, Oskar. 설명 해줘서 고마워. 이제는 나에게 매우 명확하고 모든 것을 이해합니다. 이제 (N-1) 사례에 대한 도우미 함수를 만들려고합니다. – DataPsycho