Lambda 带有Y组合器的列表函数没有递归,为什么?
注意:这是一种家庭作业,而不是——最终目标是让一个函数生成一组数字的幂集,作为数字列表提供给该函数。我有一个递归版本的函数,但我现在需要找到一些方法,用一个等效的lambda纯表达式替换我的解决方案(Lambda 带有Y组合器的列表函数没有递归,为什么?,lambda,scheme,racket,y-combinator,anonymous-recursion,Lambda,Scheme,Racket,Y Combinator,Anonymous Recursion,注意:这是一种家庭作业,而不是——最终目标是让一个函数生成一组数字的幂集,作为数字列表提供给该函数。我有一个递归版本的函数,但我现在需要找到一些方法,用一个等效的lambda纯表达式替换我的解决方案(append,mapm等)中的每个显式递归函数 因此,我从较小的问题开始,希望将它们结合起来编写完整的函数。我用纯lambda(Y combinator)成功地提出了一个非递归阶乘函数,但我现在尝试提出一个很好的函数,它可以对列表中的每个数字进行平方运算——在跳到乘法递归函数之前,尝试解决较小的问题
append
,mapm
等)中的每个显式递归函数
因此,我从较小的问题开始,希望将它们结合起来编写完整的函数。我用纯lambda(Y combinator)成功地提出了一个非递归阶乘函数,但我现在尝试提出一个很好的函数,它可以对列表中的每个数字进行平方运算——在跳到乘法递归函数之前,尝试解决较小的问题:
(define (sqrlist numlist)
(((lambda (f)
((lambda (x) (x x))
(lambda (g)
(f (lambda (x) ((g g) x))))))
(lambda (f)
(lambda (x)
(cons (sqr (first x)) (rest x))))) numlist))
上面的代码不会递归,尽管前面有Y combinator——很明显,我在将正确的参数传递给函数时遇到了一些问题——有什么想法吗?这里有一个可能的答案,我知道您已经解决了它,但有第二个意见可能会有用:) 它是“lambda only”,因为它是专门用匿名函数编写的,它甚至不使用
define
。以下是如何称呼它:
(((lambda (X)
((lambda (proc)
(proc proc))
(lambda (proc)
(X (lambda (arg)
((proc proc) arg))))))
(lambda (sqrlist)
(lambda (lst)
(if (null? lst)
'()
(cons (* (car lst) (car lst))
(sqrlist (cdr lst)))))))
'(1 2 3 4 5))
如果您有一个工作过程,那么转换为匿名过程是相对简单和机械的。给每个lambda一个额外的参数,即“自身”,并复制过程。所以
(define (add-list list)
(if (empty? list)
0
(+ (first list) (add-list (rest list)))))
变成
(λ(list) (if (empty? list) 0 (+ (first list) (add-list (rest list)))))
这当然是一个问题,因为没有定义添加列表。因此,我们必须确保每次都能传递信息
(λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
但是我们首先从哪里得到自己呢?好吧,我们复制粘贴(并给它一个参数)
将此“复制和粘贴”抽象到Ycombinator在中开发得非常出色,您一定要查看它
但请记住,第一步是“让它工作起来”。在抽象出define
s.解决之前,请先这样做!我可以删除这个问题吗?如果你已经解决了这个问题,你能在这里发布答案吗(或者在你原来的问题上?)。这是一个非常有趣的问题,请回答IMHO。嗨,我很乐意,但我的专业人员对公开发布代码非常严格,直到超过截止日期。。不过,我可以通过电子邮件给你发送一个文件(截止日期是星期二晚上。此外,我应该澄清我的解决方案并不是针对整个问题…但是-它只是针对我上面创建的函数…是的,(lambda(f)(lambda(x)(cons(sqr(first x))(rest x))
没有使用f
。它应该是(lambda(f))(lambda(x)(cons(sqr(first x))(f(rest x)))
,让它递归。很好!现在我如何进一步抽象它以获取两个参数…假设我想将一个列表中的所有平方值转换为另一个列表中的所有平方值…而不使用append:DI基本上现在正试图编写一个非递归版本的append函数..问题是,我试图向它传递两个参数和no-go.对于不止一个参数,事情可能有点棘手。可能是通过使用咖喱?!我没有使用咖喱就得到了它!(感谢上帝,它已经很混乱了!)看一看:(定义(my-append3 lst1 lst2)(((lambda(f)(lambda(x)(x)(x))lambda(g)(f(lambda(x)((g)x)())))))(lambda(x)(lambda)(x)(lambda)(g)(g)(x)(lambda)(g)(x))lambda(x)(cond[(空?x)lst2][else(cons(first x)(f(rest x))))))lst1))
excellent!我希望在完成作业并评分后,您可以共享代码
(λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
((λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
(λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
'(1 2 3 4))