我是计划的初学者。我曾经在使用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可以做类似的问题?请建议任何其他替代方案。
答案 0 :(得分:2)
让我们来看一些变化(全部在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)