gpt4 book ai didi

lisp - 用于反转 2-list 列表元素的 Scheme 函数

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

这是 EOPL 的练习。过程 (invert lst) 采用 lst,它是 2-list 的列表,并返回每个 2-list 反转的列表。

(define invert
(lambda (lst)
(cond((null? lst )
'())
((= 2 (rtn-len (car lst)))
( cons(swap-elem (car lst))
(invert (cdr lst))))
("List is not a 2-List"))))

;; Auxiliry Procedure swap-elements of 2 element list

(define swap-elem
(lambda (lst)
(cons (car (cdr lst))
(car lst))))

;; returns lengh of the list by calling
(define rtn-len
(lambda (lst)
(calc-len lst 0)))

;; calculate length of the list
(define calc-len
(lambda (lst n)
(if (null? lst)
n
(calc-len (cdr lst) (+ n 1)))))

这似乎可行,但看起来非常冗长。这可以缩短或以更优雅的方式编写吗?我如何停止处理任何不是 2 列表的单个元素?目前执行继续到下一个成员,如果当前成员不是 2-list,则将当前成员替换为“List is not a 2-List”。

最佳答案

EOPL 语言提供了 eopl:error 程序来提前退出并显示错误消息。它在本书(第 3 版)的第 15 页上有介绍。

EOPL 语言还包括来自标准 Scheme 的 map 过程。尽管本书中可能没有使用它,但您仍然可以使用它来获得比显式递归更短的解决方案。您也可以使用 Scheme 的标准 length 过程。

#lang eopl

(define invert
(lambda (lst)
(map swap-elem lst)))

;; Auxiliary Procedure swap-elements of 2 element list

(define swap-elem
(lambda (lst)
(if (= 2 (length lst))
(list (cadr lst)
(car lst))
(eopl:error 'swap-elem
"List ~s is not a 2-List~%" lst))))

关于lisp - 用于反转 2-list 列表元素的 Scheme 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5042809/

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