Recursion 格式中的非显式递归

Recursion 格式中的非显式递归,recursion,scheme,Recursion,Scheme,我需要一些在scheme中使用抽象列表函数进行递归的帮助。例如,我如何使用显式递归更改此代码,使其不会在正文中包含函数名: (define (make_unique_list lst) (cond [(empty? lst) empty] [(member? (first lst) (rest lst)) (make_unique_list (rest lst))] [else (cons (first lst) (make_unique_list (rest ls

我需要一些在scheme中使用抽象列表函数进行递归的帮助。例如,我如何使用显式递归更改此代码,使其不会在正文中包含函数名:

(define (make_unique_list lst) 
  (cond
    [(empty? lst) empty]
    [(member? (first lst) (rest lst)) (make_unique_list (rest lst))]
    [else (cons (first lst) (make_unique_list (rest lst)))]))

谢谢

这看起来像是可以使用
fold
。通过将
cond
中非空案例的逻辑组合到一个累积函数中,我们可以有选择地累积列表中尚未看到的项

回想一下,指定给fold的函数有两个参数:一个是当前项,另一个是当前累积值。在这种情况下,当前项的类型为X,当前累积值为X的列表。函数需要返回X的列表


如果需要保留输入列表的顺序,请明智地选择
向右折叠
向左折叠
或环境中的等效项。

这看起来像是可以使用
折叠
。通过将
cond
中非空案例的逻辑组合到一个累积函数中,我们可以有选择地累积列表中尚未看到的项

回想一下,指定给fold的函数有两个参数:一个是当前项,另一个是当前累积值。在这种情况下,当前项的类型为X,当前累积值为X的列表。函数需要返回X的列表

如果您需要保留输入列表的顺序,请明智地选择
向右折叠
向左折叠
或您环境中的等效项。

在R6RS方案中:

(import (rnrs) (rnrs lists))

(define (make-unique-list lst)
  (reverse
   (fold-left
    (lambda (r e) (if (member e r) r (cons e r)))
    '()
    lst)))

(display (make-unique-list '(1 2 3 4 3 5 6 3 2 1 7)))
=> {1 2 3 4 5 6 7}
在球拍中:

(define (make-unique-list lst)
  (reverse
   (foldl
    (lambda (e r) (if (member e r) r (cons e r)))
    '()
    lst)))

请注意,在前两个示例中,我使用了
reverse
foldl
/
foldr
,而不是
foldr
foldright
(自己试试看原因)

顺便说一句,这个过程通常被称为
删除重复项
,并且是内置的:

(remove-duplicates '(1 2 3 4 3 5 6 3 2 1 7))
在R6RS方案中:

(import (rnrs) (rnrs lists))

(define (make-unique-list lst)
  (reverse
   (fold-left
    (lambda (r e) (if (member e r) r (cons e r)))
    '()
    lst)))

(display (make-unique-list '(1 2 3 4 3 5 6 3 2 1 7)))
=> {1 2 3 4 5 6 7}
在球拍中:

(define (make-unique-list lst)
  (reverse
   (foldl
    (lambda (e r) (if (member e r) r (cons e r)))
    '()
    lst)))

请注意,在前两个示例中,我使用了
reverse
foldl
/
foldr
,而不是
foldr
foldright
(自己试试看原因)

顺便说一句,这个过程通常被称为
删除重复项
,并且是内置的:

(remove-duplicates '(1 2 3 4 3 5 6 3 2 1 7))

可以在Scheme中使用所谓的。我自己没有用过,但主要是因为它有点难理解。不过这很有用


另请参见:

可以使用所谓的。我自己没有用过,但主要是因为它有点难理解。不过这很有用


另请参见:

“非显式”即隐式递归通常表示折叠。通过Y的递归仍然是一个递归,那里仍然有一个函数调用,例如
Y(λfact.λn.n<2?1;n*fact(n-1))
。虽然匿名,但它仍然是一个递归。:)@你的意志是对的,我可能误解了这个问题。不过,使用Y型梳。您没有明确使用问题中提到的任何函数名。我们使用
fact
。。。只是函数
事实
是Y为我们当场创建的,而不是一些全局函数;仍然是一个函数。:)我必须同意赫尔曼的观点。Y组合子仍然是某种隐式递归。Y组合符听起来像是一个高阶函数,就像fold一样。@LoïcFaure Lacroix
foldNat(λn.λr.n*r)1
:看不到函数调用。“非显式”即隐式递归通常指fold。通过Y的递归仍然是一个递归,那里仍然有一个函数调用,例如
Y(λfact.λn.n<2?1;n*fact(n-1))
。虽然匿名,但它仍然是一个递归。:)@你的意志是对的,我可能误解了这个问题。不过,使用Y型梳。您没有明确使用问题中提到的任何函数名。我们使用
fact
。。。只是函数
事实
是Y为我们当场创建的,而不是一些全局函数;仍然是一个函数。:)我必须同意赫尔曼的观点。Y组合子仍然是某种隐式递归。Y组合符听起来像一个高阶函数,就像fold一样。@LoïcFaure Lacroix
foldNat(λn.λr.n*r)1
:没有函数调用。