球拍列表长度

dan*_*lee 5 list racket

我试图弄清楚列表的长度

但没能做到

显示

 expected: number?
  given: #<procedure:list>
  argument position: 1st
  other arguments...:
Run Code Online (Sandbox Code Playgroud)

我的代码

(define (length len)

  (list '(1 2 3 4 5 6 7))
  (if (= list null)
     (len)
     (cdr list)
     )
  (+ len 1)
  (length)
  )


(length 0)
Run Code Online (Sandbox Code Playgroud)

我本来想做的是

  1. 获取列表(在其中,因为无法弄清楚如何获取列表...)
  2. printf len制作“if”函数,以便在(cdr列表)变为空时可以

如果你们有任何错误请告诉我

大约两周前我试图学习 Racket,但不知道该怎么做......

谢谢!

Ale*_*uth 5

以下是我如何系统地创建一个函数来查找列表的长度。

最终结果将是

;; length : [Listof Element] -> Number
;; Produces the number of elements in the list

(define (length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   (+ 1 (length (rest lst)))]))
Run Code Online (Sandbox Code Playgroud)

但更重要的是系统化的过程,你可以用它来编写更多的程序。我这里使用的过程是《如何设计程序》一书中解释的设计方法

1:什么是清单?

列表要么是空的,要么是第一个元素与其余元素的组合。这个“休息”是另一个清单。

在 Racket 中,“空”写为'(),列表的“组合”写为cons

A [Listof Element] is one of:
 - '()
 - (cons Element [Listof Element])
Run Code Online (Sandbox Code Playgroud)

列表的一些示例:

'()                                              ; empty
(cons "I'm alone" '())                           ; one element "I'm alone"
(cons "Hello" (cons "there" '()))                ; two elements "Hello" and "there"
(cons 1 (cons 3 (cons 5 (cons 7 (cons 9 '()))))) ;  five elements, odd numbers
Run Code Online (Sandbox Code Playgroud)

2:有什么length作用?

length函数接受一个列表并生成一个表示列表中元素数量的数字。空列表为 length 0,上面的示例应该有长度0, 1, 2, 和5

;; length : [Listof Element] -> Number
;; Produces the number of elements in the list

;; (length '())                                     = 0
;; (length (cons "I'm alone" '()))                  = 1
;; (length (cons "Hello" (cons "there" '())))       = 2
;; (cons 1 (cons 3 (cons 5 (cons 7 (cons 9 '()))))) = 5

(define (length lst)
  ???)
Run Code Online (Sandbox Code Playgroud)

3:定义中的情况是什么?

列表要么是空的,要么是缺点。为了测试它是否为空,我们可以将 acond与针对空情况的问题和针对 cons 情况的(empty? lst)问题一起使用。(cons? lst)

(define (length lst)
  (cond
    [(empty? lst)  ???]
    [(cons? lst)   ???]))
Run Code Online (Sandbox Code Playgroud)

4:每种情况下都有哪些数据“子部分”可用?

空列表没有子片段。

然而,a(cons Element [Listof Element])有两个子块:

  • 第一件事,Element
  • 以及列表的其余部分[Listof Element]

要在球拍中获取这些,您可以分别使用firstrest

(define (length lst)
  (cond
    [(empty? lst)  ???]
    [(cons? lst)   ... (first lst) ... (rest lst) ...]))
Run Code Online (Sandbox Code Playgroud)

5:这些子部分是否有复杂数据?

(first lst)只是一个Element. 就 的目的而言length,它并不复杂,我们不必进一步处理它。

但这(rest lst)是另一个问题[Listof Element],而且很复杂。我们该如何处理呢?通过使用辅助函数。

在本例中,我们需要一个与长度相关的辅助函数,并接受 a[Listof Element]作为参数。在这种情况下,该辅助函数恰好是我们当前定义的length函数!我们可以递归地使用它,因为它是一个较小的子块。(rest lst)

(define (length lst)
  (cond
    [(empty? lst)  ???]
    [(cons? lst)   ... (first lst) ... (length (rest lst)) ...]))
Run Code Online (Sandbox Code Playgroud)

6:利用你对长度应该如何运作的直觉以及我们之前写的例子来填补漏洞

第一个例子(length '()) = 0告诉我们第一???个洞应该被填充0

(define (length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   ... (first lst) ... (length (rest lst)) ...]))
Run Code Online (Sandbox Code Playgroud)

第二个洞、...第一个洞周围的 s 以及其余部分的长度,难度更大。但是你对长度的直觉应该告诉你,第一个和其余的“组合”列表的长度应该是一加上其余的长度。将其转化为代码:

(define (length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   (+ 1 (length (rest lst)))]))
Run Code Online (Sandbox Code Playgroud)

我使用的系统步骤在《如何设计程序》一书中进行了解释。