lambda - 是否可以在不使用 lambda 的情况下将本地过程绑定(bind)到 letrec 中的变量?

标签 lambda scheme racket letrec

我是计划的初学者。我曾经在使用 letrec 和使用 lambda 绑定(bind)时执行过类似的程序。

(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)

关于lambda - 是否可以在不使用 lambda 的情况下将本地过程绑定(bind)到 letrec 中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32048723/

相关文章:

c++ - Lambda 隐式捕获因从结构化绑定(bind)声明的变量而失败

python - 必须有更好的方法来获取这个字典列表的平均值和中位数

Scheme 函数返回最多第一个数字

scheme - Little Schemer atom vs (quote atom)

racket - 如何清除或覆盖 DrRacket 中的一行文本?

compiler-construction - 我应该在哪个阶段为我的编译器实现尾调用优化

java - Jersey 和 Java 8(Lambda 表达式)

clojure - Lisp 家族 : Different evaluation of a symbol call and symbol as argument

syntax - 访问、实例化和声明模块之间有什么区别?

maven - 为什么对于相同程序,lambda类的生成名称不相同