Ограниченные переменные и область - PullRequest
0 голосов
/ 26 февраля 2010

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

(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))

Я хотел бы знать, что я могу с этим поделать спасибо!

Ответы [ 2 ]

1 голос
/ 27 февраля 2010

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

То, как вы написали lenght - это не столько рекурсия, сколько просто прославленный цикл while! Нет смысла в рекурсии, если (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 принимает только один аргумент.

1 голос
/ 26 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...