gpt4 book ai didi

lisp - 关于 LISP 程序,common lisp

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:31 30 4
gpt4 key购买 nike

你们能帮帮我吗,这是我们的讲师给我们的教程问题,无论我们尝试了多少,我们实际上似乎都无法破解它。请帮忙

; perform some type/error checking,
; then call function h to ....

(defun f (L N)
(cond
( (not (listp L) ) nil)
( (not (integerp N) ) nil)
( (< N 1) nil)
( (< (length L) N) nil)
(t (h L N '() ) )
)
)

(defun h (L N Acc)
(cond
( (eq N 1) (append Acc (cdr L) ) )
(t (h (cdr L) (- N 1) (append Acc (list (car L) ) ) ) )
)
)
  1. 对于函数调用 (f '(1 2 3) 1) 显示对函数 h 的调用序列(如果有),并显示函数 f 返回的最终值。

  2. 对于函数调用 (f '(1 2 3 4) 3) 显示对函数 h 的调用顺序(如果有),以及显示函数 f 返回的最终值。

  3. 如果我们观察到函数 f 似乎执行了一些基本的类型/错误检查,然后调用函数 h 来完成“真正的”工作,那么 h 是什么实际上做到了吗?

最佳答案

一般说明

  • 你不能假设EQ根据规范,将可靠地处理数字。由于 N 是一个数字,您应该使用 =相反。
  • CONDH 中只有两种可能的结果;可以用 IF 重写.
  • 不要在括号之间添加空格,不要让括号单独出现在一行中。请遵循 Lisp 表单的常用格式(参见示例 http://lisp-lang.org/style-guide)。
  • 过度使用 APPENDH 中使代码比它应该的更复杂。

函数F

(defun f (L N)
(cond
( (not (listp L) ) nil)
( (not (integerp N) ) nil)
( (< N 1) nil)
( (< (length L) N) nil)
(t (h L N '() ) )
)
)

函数 F 仅在代码到达 T 保护的子句时调用 H,这仅在所有先前测试均失败时才会发生。让我们反转所有测试以简化一点,并使用 WHEN .等效形式是:

(defun f (list number)
(when (and (listp list)
(integerp number)
(<= 1 number (length list)))
(h list number)))

省略了 h 的第三个参数,因为我们不需要它。

函数H

(defun h (L N Acc)
(cond
( (eq N 1) (append Acc (cdr L) ) )
(t (h (cdr L) (- N 1) (append Acc (list (car L) ) ) ) )
)
)

代码正在使用 APPEND在递归的每一步。添加累加器可能是为了使函数尾递归,或者可能只是为了混淆意图。您可以在没有辅助列表的情况下重写 H 以更好地理解它的作用:

(defun h (list number)
(if (= number 1)
(cdr list)
(cons (car list)
(h (cdr list) (- number 1)))))

还有一些测试:

(f '(a b c d e f) 3)
=> (A B D E F)

(f '(a b c d e f) 2)
=> (A C D E F)

关于lisp - 关于 LISP 程序,common lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513801/

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