另一个逻辑问题,任务是找到列表的深度,例如:给定一个列表 (A B (C D (E)))
它应该以某种方式表明深度是2(如果包含基本列表,则为 3)。我仅限于一组常见的 Racket 功能,我将在下面列出这些功能。我所在的位置可以迭代列表,但最终会在第一个子列表处停止,即: (A (B (C)) (D (E (F))))
出来只有 2 个。
以下是可用功能的列表:
- cons、car、cdr、define、quote、if、cond、else
- 算术的基本形式(+、-、*、/)
- 非常基本的测试(null?、list?、eq?、数字比较)
到目前为止,这是我的定义,如果有人能够将我转向正确的方向,我将非常感激。
(define (len l) (if (null? l) 0 (+ 1 (len (cdr l)))))
(define A '(A (B) (C (D))))
(define (depth l) (cond
[(null? l) '()]
[(list? (car l)) (cons (car l) (depth (car l)))]
[else (depth (cdr l))]
))
(depth A)
(len (depth A))
最佳答案
这是我在 Common Lisp 中的定义
(defun list-depth (list &optional (depth 0))
(cond ((null list) depth)
((atom (first list)) (list-depth (rest list) depth))
(t (max (list-depth (first list) (1+ depth))
(list-depth (rest list) depth)))))
我没有在这台计算机上安装 Racket,因此这里是对 Scheme/Racket 的未经测试的翻译:
(define (list-depth lst depth)
(cond ((null? lst) depth)
((not (list? (car lst)) (list-depth (cdr list) depth))
(else (max (list-depth (car lst) (+ 1 depth))
(list-depth (cdr lst) depth)))))
逻辑如下:
- 如果列表为空,则返回当前深度。
- 如果列表的
car
是atom(不是列表),则不会增加深度,找到列表的其余部分(cdr
)的深度. - 否则,深度将是
car
的 +1 深度(记住,现在是列表)和cdr
的深度之间的最大值列表。请注意car
的深度增加,而cdr
的深度没有增加。
使用的预定义过程:+
、max
、null?
、list?
、汽车
,cdr
,不是
。
关于list - 使用(受限)Racket 查找列表的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132674/