2010-02-26 2 views
0

매개 변수로 정수를 가져 오는 프로 시저를 작성하려고 시도했습니다. 숫자가 회귀 식이면 true를 반환하고 그렇지 않으면 false를 반환하며 전역 매개 변수의 값을 변경하는 데 문제가있는 것으로 보입니다. 내부 기능 블록.제한된 변수와 범위

(define index 0) 
(define (palindrome? x) 
    (if (= (lenght x) 1) 
     #t 
     (if (last_equal_first x) 
      (palindrome? (remove x)) 
      #f))) 
(define (lenght x) 
    (define index **(+ index 1))** 
    (if (= (modulo x (ten_power index)) x) 
     index 
     (lenght x))) 

(define (last_equal_first x) 
    (if (= (modulo x 10) (modulo x (/ (ten_power (lenght x)) 10))) 
     #t 
     #f)) 

나는 그것에 대해 덕분에 무엇을 할 수 있는지 알고 싶습니다!

답변

1

글쎄, 하나의 문제는 length 함수에서 인덱스를 사용하고 나면 재정의한다는 것입니다. define 여기에 원하는 것을 실제로 수행하지 않습니다 - 당신은 set!을 원합니다.

그러나 길이 함수를 두 번 이상 호출하려고하면 다른 버그가 발견 될 것입니다. 처음에는 index0으로 설정하지 않으므로 길이 함수는 한 번만 작동합니다.

그러나 이것은 숙제 지정처럼 보입니다. 이 문제를 해결하기위한 지침을 분명히 하시겠습니까? 아니면 알고리즘을 더 잘 이해할 수있는 단서를 원하십니까?

1

은 무슨 (define ...)lenght에서하는 일은 그 더 로컬은 상단에 정의 된 "인덱스"보다 범위가 "인덱스"라는 새로운 변수를 만드는 것입니다. 이것은 단지 피상적 인 문제입니다. 더 중요한 것은 Scheme을 사용하여 C 코드를 작성하려는 것 같습니다. 이와 같은 간단한 숙제를 쓰면 이 아니고은 전역 변수를 사용해야 할 필요가 없으며 변수가 만들어지면 변수를 변경해야합니다. 많은 프로그래머는 기능 프로그래밍을 처음 배울 때 생각하는 방법을 바꾸는 데 어려움을 겪습니다.

작성한 방법은 lenght입니다. 단지 재밌는 while 회 돌이가 아닙니다. (lenght x)(lenght x)으로 다시 호출하는 경우 재귀에 대한 요점은 없습니다. 예를 들어, 여기에 내가 10 기지 자리 숫자에 얼마나 많은 계산 digits을 작성하는 방법은 다음과 같습니다 나는 그것을 한 번 작성한 변수를 변경하지,하지만 새로운 변수를 매번 만들 결코 방법

(define digits 
    (lambda (n) 
    (letrec ([digit-helper (lambda (n index) 
          (if (= (modulo n (expt 10 index)) n) 
           index 
           (digit-helper n (add1 index))))]) 
     (digit-helper n 0)))) 

공지 사항 . 색인을 추적해야하므로 digit이 하나의 인수 만 취하는 사실을 가려 내기 위해 두 개의 인수를 취하는 도우 함수 digit-helper을 만들었습니다.