Может ли локальная процедура быть привязанной к переменной в letrec без использования лямбды?

Я новичок в схеме. Раньше я делал подобные программы, используя letrec и linding.

(define (drop l n)
  (letrec ((iter (lambda(ls x)
  (cond ((null? ls) ls)
        ((> x 1) (cons (car ls) (iter (cdr ls) (- x 1))))
        (else (iter (cdr ls) n)))))) (iter l n)))

(define factorial
  (lambda (n)
    (letrec ((iter
              (lambda (product counter)
                (if (> counter n)
                    product
                    (iter (* counter product)
                          (+ counter 1))))))
      (iter 1 1)))

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

1 ответ

Решение

Давайте рассмотрим несколько вариантов (все в Racket).

Сначала ваш оригинал:

#lang racket
(define factorial
  (lambda (n)
    (letrec ((iter
              (lambda (product counter)
                (if (> counter n)
                    product
                    (iter (* counter product)
                          (+ counter 1))))))
      (iter 1 1))))

(factorial 5)

Первый lambda легко скрывается:

(define (factorial2 n)
    (letrec ((iter
              (lambda (product counter)
                (if (> counter n)
                    product
                    (iter (* counter product)
                          (+ counter 1))))))
      (iter 1 1)))

(factorial2 5)

Внутренний определяет и letrec эквивалентны:

(define (factorial3 n)
  (define (iter product counter)
    (if (> counter n)
        product
        (iter (* counter product)
              (+ counter 1))))
  (iter 1 1))

(factorial3 5)

Если вы используете один из языков обучения (для HtDP), внутреннее определение называется локальным определением, и вам придется использовать local построить:

(define (factorial4 n)
  (local [(define (iter product counter)
            (if (> counter n)
                product
                (iter (* counter product)
                      (+ counter 1))))]
    (iter 1 1)))

(factorial4 5)
Другие вопросы по тегам