是否可以在不使用 lambda 的情况下将本地过程绑定到 letrec 中的变量?
Can a local procedure be bound to a variable in letrec without using lambda?
我是scheme的初学者。我曾经在使用 letrec 和使用 lambda 绑定时做这样的程序。
(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)))
但是我最近发现我们学院的估价部门不允许使用'lambda'这个结构。无论如何,是否可以在不使用 lambda 的情况下完成类似的问题?请提出任何其他替代方案。
让我们检查一些变体(全部在 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)
我是scheme的初学者。我曾经在使用 letrec 和使用 lambda 绑定时做这样的程序。
(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)))
但是我最近发现我们学院的估价部门不允许使用'lambda'这个结构。无论如何,是否可以在不使用 lambda 的情况下完成类似的问题?请提出任何其他替代方案。
让我们检查一些变体(全部在 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)