我在一个Scheme类中,我很好奇在不使用define的情况下编写递归函数.当然,主要的问题是,如果没有名称,你就无法调用自身内部的函数.
我确实找到了这个例子:它是一个只使用lambda的阶乘生成器.
((lambda (x) (x x))
(lambda (fact-gen)
(lambda (n)
(if (zero? n)
1
(* n ((fact-gen fact-gen) (sub1 n)))))))
Run Code Online (Sandbox Code Playgroud)
但我甚至无法理解第一次调用,(lambda(x)(xx)):究竟是做什么的?你在哪里输入你想要得到的阶乘值?
这不是为了上课,这只是出于好奇.
我试图解决最大子序列和问题,并提出了一个neato解决方案
msss :: (Ord a, Num a) => [a] -> a
msss = f 0 0
f gmax _ [] = gmax
f gmax lmax (x:xs) =
let g = max (lmax + x)
in f (g gmax) (g 0) xs
Run Code Online (Sandbox Code Playgroud)
您调用包装函数msss,然后调用f该函数,然后实际执行该工作.解决方案很好,afaik工作正常.如果由于某种原因我必须解决生产代码中的最大子序列和问题,那就是我会这样做的.
然而,包装函数确实让我感到困惑.我喜欢它如何在haskell中,如果你足够坚持,你可以将你的整个程序写在一条线上,真正让家庭认为程序几乎只是一个大表达.所以我想我会尝试消除额外挑战的包装函数.
现在我遇到了经典问题:如何进行匿名递归?当你不能给函数命名时,你如何做递归?值得庆幸的是,计算机的父亲在很久以前通过发现定点组合器来解决这个问题,其中最受欢迎的是Y Combinator.
我已经做了各种尝试来设置Y组合器,但它们无法通过编译器.
msss' :: [Int] -> Int
msss' = (\y f x -> f (y y f) x)
(\y f x -> f (y y f) …Run Code Online (Sandbox Code Playgroud) recursion haskell functional-programming y-combinator anonymous-recursion
我一直在研究禁止使用def-before-def并且没有可变单元格(no set!或setq)的语言如何提供递归.我当然跑过(着名的?臭名昭着的?)Y组合者和朋友,例如:
当我以这种方式实现"letrec"语义时(也就是说,允许定义一个局部变量使得它可以是一个递归函数,在封面下它不会引用它自己的名字),组合器我最后写的看起来像这样:
Y_letrec = ?f . (?x.x x) (?s . (?a . (f ((?x.x x) s)) a))
Run Code Online (Sandbox Code Playgroud)
或者,将U组合子分解出来:
U = ?x.x x
Y_letrec = ?f . U (?s . (?a . (f (U s)) a))
Run Code Online (Sandbox Code Playgroud)
读这个:Y_letrec是一个带有待递归函数的函数f.
f必须是一个单参数函数,它接受s,可以调用实现自递归s的函数f.f期望定义并返回执行"实际"操作的"内部"函数.该内部函数接受参数a(或者在一般情况下接受参数列表,但不能用传统的表示法表示).调用Y_letrec的结果是调用的结果
f,并且它被假定为"内部"函数,准备被调用.
我这样设置的原因是我可以直接使用待递归函数的解析树形式,而无需修改,只是在处理letrec时转换期间在其周围包裹一个额外的函数层.例如,如果原始代码是:
(letrec ((foo (lambda (a) (foo (cdr a))))))
Run Code Online (Sandbox Code Playgroud)
然后转换后的形式将是:
(define foo (Y_letrec (lambda (foo) (lambda (a) (foo (cdr a))))))
Run Code Online (Sandbox Code Playgroud)
请注意,内部函数体在两者之间是相同的. …
我正在做一项学术练习(为了个人成长)。我想找到一种编程语言,使您可以定义能够接受自身(即,指向自身的指针)作为参数的函数。
例如,在JavaScript中:
function foo(x, y) {
if (y === 0) return;
x(x, y - 1);
}
foo(foo, 10);
Run Code Online (Sandbox Code Playgroud)
上面的代码将在y达到零之前恰好执行11次foo(),从而导致递归终止。
我尝试在OCaml中定义类似的功能,如下所示:
let rec foo x y = if y < 1 then "hi" else x x (y - 1);;
Run Code Online (Sandbox Code Playgroud)
但是它失败并出现类型错误:
Error: This expression has type 'a -> 'b -> 'c
but an expression was expected of type 'a
The type variable 'a occurs inside 'a -> 'b -> 'c
Run Code Online (Sandbox Code Playgroud)
我想知道,是否可以在OCaml中定义这样的功能?我对OCaml特别感兴趣,因为我知道它具有全局类型推断系统。我想知道这样的功能是否与全局类型推断兼容。因此,我正在寻找任何具有全局类型推断功能的语言的示例。
ocaml type-systems type-inference hindley-milner anonymous-recursion
我正在阅读The Little Schemer并对以下代码感到困惑:
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else
(+ 1 (len (cdr l)))))))
eternity)
(define eternity
(lambda (x)
(eternity x)))
Run Code Online (Sandbox Code Playgroud)
代码是确定空列表,否则它永远不会停止.
为什么" len"没有递归?
几天前我在"C#匿名递归"中浏览了这个网站.本文的主旨是以下代码在C#中不起作用:
Func<int, int> fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Run Code Online (Sandbox Code Playgroud)
然后,文章详细介绍了如何使用currying和Y-combinator回到C#中的"Anonymous Recursion".这很有趣,但我担心日常编码有点复杂.此时至少......
我喜欢看自己的东西,所以我打开了Mono CSharp REPL并输入了该行.没有错误.所以,我进来了fib(8);.令我非常惊讶的是,它奏效了!REPL回复了21!
我想也许这可能是REPL的一些魔力,所以我点了'vi',输入以下程序,然后编译它.
using System;
public class Program
{
public static void Main(string[] args)
{
int x = int.Parse(args[0]);
Func<int, int> fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Console.WriteLine(fib(x));
}
}
Run Code Online (Sandbox Code Playgroud)
它也完美地建造和运行!
我在Mac上运行Mono 2.10.我现在无法访问Windows计算机,所以我无法在Windows上的.NET上进行测试.
这是在.NET上修复过的还是Mono的静音功能?这篇文章已经有几年了.
如果它只是单声道,我不能等待下一次面试,他们要求我用我选择的语言(Mono …
注意:这是一种家庭作业,而不是一种 - 最终目标是拥有一个函数,该函数生成一组数字的幂集,作为数字列表提供给该函数。我有函数的递归版本,但现在我需要找到解决方案我有(替换每个明确递归函数的一些方法append,mapm等等)与只相当于λ-表达。
因此,我从较小的问题开始,并希望将它们全部结合起来编写一个完整的函数。我已经设法使用纯 lambda(Y 组合子)提出了一个非递归阶乘函数,但我现在正在尝试提出一个很好的函数,该函数可以对列表中的每个数字进行平方——尝试在跳转之前解决较小的问题直到一个乘法递归函数:
(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))
Run Code Online (Sandbox Code Playgroud)
上面的代码不会递归,尽管在它之前存在 Y 组合器——我显然在将正确的参数传递给其中的函数时遇到了一些问题——有什么想法吗?
可能重复:
javascript:递归匿名函数?
匿名递归PHP函数
我在想......是否可以使用匿名函数进行递归?
这是一个例子:我需要得到六个字符长的字符串,它可能只包含数字和空格.唯一的规则是它不能以空格开头或结尾.我们检查一下,如果发生这种情况 - 只需在相同的匿名函数上调用递归.怎么样!?
function() {
$chars = range(0, 9);
$chars[] = ' ';
length = 6;
$count = count($chars);
$string = '';
for ($i = 0; $i < $length; ++$i) {
$string .= $chars[mt_rand(0, $count - 1)];
}
$string = trim($string);
if (strlen($string) !== $length) { // There were spaces in front or end of the string. Shit!
// Do recursion.
}
return $string;
}
Run Code Online (Sandbox Code Playgroud) php recursion reference anonymous-function anonymous-recursion
recursion ×4
scheme ×4
y-combinator ×4
lambda ×2
.net ×1
c# ×1
combinators ×1
haskell ×1
lisp ×1
mono ×1
ocaml ×1
php ×1
racket ×1
reference ×1
type-systems ×1