list - 使用(受限)Racket 查找列表的深度

标签 list recursion lisp racket depth

另一个逻辑问题,任务是找到列表的深度,例如:给定一个列表 (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 的深度没有增加。

使用的预定义过程:+maxnull?list?汽车cdr不是

关于list - 使用(受限)Racket 查找列表的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132674/

相关文章:

python - 编辑列表中的元素 - python

java - 在递归方法中返回值是如何工作的? [Java]

c++ - myProgrammingLab "palindrome"挑战和递归

android - 程序流程 AppInventor

string - 在python中将列表转换为字符串

Python:将项目追加到列表N次

javascript - 使用 JSON 递归

lisp - 根据 Lisp 中的字符匹配对列表进行排序

scheme - (define (add x y) (+ x y)) 和 (define add (lambda (x y) (+ x y))) 有什么区别?

python - 在 Common Lisp 中管理依赖关系