gpt4 book ai didi

lisp - 计划中的展开功能

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:41 25 4
gpt4 key购买 nike

目标仅使用两个参数实现unfold 函数。

参数:

  • 第一个参数是 f,它接受某个类型 I 的初始值并返回 nil 或两个元素的 cons 对(这两个中的第一个是某个类型 A 列表中的下一个元素,下一个初始值某种类型 I) 的值。
  • 第二个参数是某个类型 I 的初始值,返回值是一个类型 A 的列表。

这是我目前所拥有的,我不确定为什么它不起作用:

(define (descending i)
(if (= i 0)
(list)
(cons i (- i 1))))

(define nil (list))

(define (unfold f init)
(if (eq? (f init) '())
(list)
(cons init (unfold f (f init)))))

(unfold (descending 5))

应该评估为

'(5 4 3 2 1)

这应该是结果,但不是。我做错了什么?

最佳答案

首先,它应该是(unfold descending 5)。然后 f 会产生一对,你会使用它的两个组件,

(define (unfold f init)
(if (eq? (f init) '())
(list)
(cons (car (f init)) (unfold f (cdr (f init))))))

但这具有可怕的计算复杂性,因为它每次迭代调用三次 (f init)。谦虚let具有约束力的补救措施。

(define (unfold f init)
(let ((r (f init)))
(if (empty? r) ;; instead of (eq? r '())
(list)
(cons (car r) (unfold f (cdr r))))))

以及使用 named let 的尾递归形式

(define (unfold f init)
(let loop ((acc empty)
(state (f init)))
(if (empty? state)
(reverse acc)
(loop (cons (car state) acc)
(f (cdr state))))))

并使用 match .

(define (unfold f init)
(let loop ((acc empty)
(state (f init)))
(match state
((cons x next)
(loop (cons x acc)
(f next)))
(empty
(reverse acc)))))

关于lisp - 计划中的展开功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9286014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com