Может ли локальная процедура быть привязанной к переменной в 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)