2013-10-02 1 views
0

코드에서없이 modulo, remainder 또는 /로 작성된 프로 시저를 사용하여 모듈로 산술을 수행하는 반복 프로 시저를 작성하려고합니다. 이런 식으로 지금까지 보이는 코드를 작성하는 동안 그러나 나는 몇 가지 문제로 실행 :반복되는 빼기에 의한 반복 모듈?

(define (mod a b) 
    (define (mod-iter a b) 
     (cond ((= b 0) 0) 
       ((< b 0) (+ old_b new_b)))) 
    (mod-iter a (- a b))) 

당신이 볼 수 있듯이을, 나는 현재에 B의 원래 값을 추가 할 필요의 문제로 실행 b 값. 나는 그것에 대해 어떻게 가야할지 모르겠다. 또한, 두 번째 조건부의 답을 원시 데이터로 남겨 두었을 때 (enitre 프로 시저가 제대로 작동하는지 확인하기 위해) "지정되지 않은 반환 값"오류가 발생하고 나머지 코드가 루프 (또는 그렇게 보이나요?) 이것에 대한 통찰력을 가져 주셔서 감사합니다.

+0

'old_b'및 'new_b'란 무엇입니까? –

+0

@ ÓscarLópez의 [최근 답변] (http://stackoverflow.com/a/19084091/1281433)에서 설명한 것처럼 방금 한 번 호출 된 내부 정의를 사용하면 "named let"을 사용하는 것이 좋습니다. –

답변

0

mod-iter 함수를 (a b) 인수로 정의하면 mod에 정의 된 인수가 섀도 잉됩니다. 섀도 잉을 방지하기 위해 같은 다른 식별자를 사용

(define (mod a b) 
    (define (mod-iter ax bx) 
    (cond ((= bx 0) 0) 
      ((< bx 0) (+ b bx)))) 
    (mod-iter a (- a b))) 

참고,이 (더 재귀 호출이 없음) 적절한 알고리즘처럼 보이지 않는다. 일반적인 케이스 인 (> bx 0)은 어떻게 처리합니까?

(define (mod a b) 
    (define (mod-iter ax bx) 
    (cond ((= bx 0) 0) 
      ((< bx 0) (+ b bx)) 
      ((> bx 0) ...)))  ;; <- something here with mod-iter? 
    (mod-iter a (- a b))) 
+1

'else'를 사용할 수 있습니다. 같지 않거나 더 낮 으면 더 높아야합니다. – Sylwester

+1

'mod'의 끝에'mod-iter'를 호출하는 것이 옳지 않습니다; 'ax' 나'bx'에 접근 할 수 없습니다. 그것들은'a'와'b'이어야합니다, 안 그래요? –

+0

'else'를 사용할 수 있다는 것을 알았지 만 모든 숫자 가능성을 명시 적으로 열거합니다. 감사. – GoZoner

0

첫 번째 변수 이름을 캡처하지 않으려면 내부 함수에 다른 변수 이름을 사용하십시오. 두 번째는 인수가 기본 제공 버전에 비해 잘못되었다고 생각합니다. (modulo 5 6)은 5이고 (modulo 6 5)는 1입니다. 여기 어쨌든 여기에는 생체 내 시간의 변화가 있습니다. b (2 4 8 16 32 ...)의 힘의리스트를 생성하는 것은 b가 2라는 것을 의미합니다. a의 값 바로 아래까지. 그런 다음 이러한 반전 된 값을 기회주의 적으로 뺍니다. 그렇게하면 mod (expt 267 34) 85와 같은 문제가 매우 신속하게 답을 반환합니다. (몇백 가지 원시 함수 호출을 수백만 개 비교)

관련 문제