可以在不使用lambda的情况下将本地过程绑定到letrec中的变量吗?

时间:2015-08-17 11:02:49

标签: lambda scheme racket letrec

我是计划的初学者。我曾经在使用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可以做类似的问题?请建议任何其他替代方案。

1 个答案:

答案 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)