Как объявить переменную внутри функции Scheme? - PullRequest
8 голосов
/ 20 апреля 2011

Возможно ли это сделать? Допустим, я хочу получить последний элемент списка, я бы создал переменную i = 0 и увеличивал ее до длины. Любая идея? Пример был бы очень признателен.

Спасибо,

Ответы [ 2 ]

12 голосов
/ 20 апреля 2011

Есть несколько способов объявить переменную; самый чистый - let:

(let ((x some-expr))
  ; code block that uses x

Но вам не нужно это, чтобы получить последний элемент списка. Просто используйте рекурсию:

(define (last xs)
  (if (null? (cdr xs))
    (car xs)
    (last (cdr xs))))

Примечание: если вы хотите, вы можете использовать переменную для кэширования cdr результата:

(define (last xs)
  (let ((tail (cdr xs)))
    (if (null? tail)
      (car xs)
      (last tail))))
3 голосов
/ 20 апреля 2011

Да, в схеме можно определить локальные переменные, используя let или define внутри функции. Используя set!, также можно переназначить переменную, как вы себе представляете.

При этом вы, вероятно, не должны решать свою проблему таким образом. В Схеме обычно хорошей практикой является избегать set!, когда вам это не нужно (а в этом случае вам определенно не нужно). Дальнейшая итерация по списку с использованием индексов, как правило, является плохой идеей, поскольку списки схемы являются связанными списками и как таковой произвольный доступ O (n) (делая функцию last так, как вы хотите ее реализовать O(n^2)).

Таким образом, простая рекурсивная реализация без индексов будет более идиоматичной и более быстрой, чем то, что вы планируете делать, и поэтому предпочтительнее.

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