如何垂直逐个元素打印列表?球拍

How to print a list element by element vertically? Racket

我是 Racket 的菜鸟,我想弄清楚如何垂直打印一个列表的元素,因此:

(printv '(1 2 3 4))

1

2

3

4

T

我尝试使用 if 和 cond,因此:

(define (delete x lst)
  (cond [(member x lst)(append(reverse(rest(member x(reverse lst))))(rest(member x lst)))]
        [else "Error"]
  ))


    (define (printv lst)
      (cond [(< 0 (length lst)) ((printf "~a ~%" (first lst))(printv (delete (first lst) lst)))]
            [else "T"]))

但是当列表变空时我得到了这个错误

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...:

感谢帮助

您应该使用内置程序让您的生活更轻松。为什么要删除元素?只是遍历列表。试试这个:

(define (printv lst)
  (for-each displayln lst)
  (displayln "T"))

只需删除多余的括号即可解决您的问题:

(define (printv lst)
  (cond [(< 0 (length lst)) 
         (printf "~a ~%" (first lst))
         (printv (delete (first lst) lst))]
        [else "T"]))

一些提示:

在每次迭代中执行 length 会使您的函数呈指数级增长。例如。将列表加倍以显示正方形所需的时间。检查列表是否为空的更好方法是使用 (empty? lst)

如何使用 delete 获取列表的 rest 可能是我见过的最复杂的方法。由于您知道要删除第一个元素,因此可以将其替换为 (rest lst).

只是打印换行有一个功能:displayln

全部合并:

(define (printv lst)
  (cond [(empty? lst) "T"]
        [else 
         (displayln (first lst))
         (printv (rest lst))]))

纯方案版本:

(define (printv lst)
  (cond [(null? lst) "T"]
        [else 
         (display (car lst))
         (newline)
         (printv (cdr lst))]))