我试图弄清楚列表的长度
但没能做到
显示
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)
我本来想做的是
printf len制作“if”函数,以便在(cdr列表)变为空时可以如果你们有任何错误请告诉我
大约两周前我试图学习 Racket,但不知道该怎么做......
谢谢!
以下是我如何系统地创建一个函数来查找列表的长度。
最终结果将是
;; 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)
但更重要的是系统化的过程,你可以用它来编写更多的程序。我这里使用的过程是《如何设计程序》一书中解释的设计方法。
列表要么是空的,要么是第一个元素与其余元素的组合。这个“休息”是另一个清单。
在 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)
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)
列表要么是空的,要么是缺点。为了测试它是否为空,我们可以将 acond与针对空情况的问题和针对 cons 情况的(empty? lst)问题一起使用。(cons? lst)
(define (length lst)
(cond
[(empty? lst) ???]
[(cons? lst) ???]))
Run Code Online (Sandbox Code Playgroud)
空列表没有子片段。
然而,a(cons Element [Listof Element])有两个子块:
Element,[Listof Element]。要在球拍中获取这些,您可以分别使用first和rest。
(define (length lst)
(cond
[(empty? lst) ???]
[(cons? lst) ... (first lst) ... (rest lst) ...]))
Run Code Online (Sandbox Code Playgroud)
这(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)
第一个例子(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)
我使用的系统步骤在《如何设计程序》一书中进行了解释。