2010-02-26 4 views
0

Я попытался написать процедуру, которая получает целое число как параметр и возвращает значение true, если число является палиндром и ложным в противном случае, и похоже, что существует проблема с изменением значения глобального параметра, внутренний функциональный блок.Ограниченные переменные и область действия

(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

Ну, одна проблема заключается в том, что вы переопределяете индекс после его использования в функции длины. define действительно не делает то, что вы хотите здесь - вы хотите set!.

Однако, я думаю, вы найдете другую ошибку при попытке вызвать функцию длины более одного раза - вы никогда не устанавливаете index на 0 после первого раза, поэтому я считаю, что ваша функция длины будет работать только один раз.

Однако, похоже, это может быть домашнее задание. Не хотите ли вы получить четкие инструкции по устранению этих проблем, или вам нужны подсказки, которые помогут вам лучше понять алгоритм?

1

Что это (define ...) заявление делает в lenght это создать новую переменную под названием «Индекс», который более локальную область действия, чем «индекс» вы определили на самом верху. Это только поверхностная проблема - что более важно, похоже, вы пытаетесь написать C-код с помощью Scheme. В простом домашнем задании, как это, вы должны не должны использовать глобальные переменные, и вам не придется менять переменную после ее создания. У многих программистов есть проблемы с переходом, как они думают при первом изучении функционального программирования.

То, как вы написали lenght, - это не столько рекурсия, сколько прославленный цикл! Рекурсии нет смысла, если (lenght x) снова вызывает только (lenght x). Например, вот как я бы написать digits подсчитать, сколько базовых 10 цифр в номере:

(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-helper, которая принимает два аргумента, чтобы замаскировать тот факт, что digit принимает только один аргумент.

Смежные вопросы