球拍清单长度

时间:2018-10-21 08:43:38

标签: list racket

我试图弄清楚列表的长度

但没有这样做

显示

 expected: number?
  given: #<procedure:list>
  argument position: 1st
  other arguments...:

我的代码

(define (length len)

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


(length 0)

我打算做的是

  1. 获取列表(位于其中,因为无法弄清楚如何 获取列表...)
  2. 设置'if'功能,以便在{cdr列表)时可以printf len 变为空

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

大约2个星期前,我试图学习球拍,却不知道该怎么做...

谢谢!

3 个答案:

答案 0 :(得分:1)

您需要考虑Scheme。如果您已经知道一种编程语言,那么它一开始将无济于事。

(define (my-lenght lst)            ; lst is the list argument  
  (if (null? lst)                  ; call function null? to check for empty list
      0                            ; an empty list has zero i length
      (+ 1                         ; length is one more 
          (my-length (cdr lst))))) ; than the list with first element omitted

这是如何调用函数

(my-lenght '(1 2 3)) ; ==> 3

如果您查看代码,则将len作为函数调用。函数名称只是指向函数对象的变量,因此+是变量,而(+ a b)是具有3个变量的代码。一个变成函数,另外两个变成数字。

答案 1 :(得分:1)

在这里,我将系统地创建一个函数来查找列表的长度。

最终结果将是

;; 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)))]))

但是更重要的是系统的过程,您可以用来编写更多的程序。我在这里使用的过程是How to Design Programs书中解释的设计食谱

1:什么是列表?

列表为空,或者是第一个元素与其余元素的组合。这个“休息”是另一个列表。

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

A [Listof Element] is one of:
 - '()
 - (cons Element [Listof Element])

一些列表示例:

'()                                              ; 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

2:length做什么?

length函数获取一个列表,并产生一个表示列表中元素数量的数字。空列表的长度为0,上面的示例应为长度0125

;; 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)
  ???)

3:定义中有哪些情况?

列表为空或不利。要测试其是否为空,我们可以将cond与问题(empty? lst)一起用于空白案例,并将问题(cons? lst)用于反案例。

(define (length lst)
  (cond
    [(empty? lst)  ???]
    [(cons? lst)   ???]))

4:在每种情况下,都有哪些可用的“子数据”?

一个空列表没有小块。

但是,(cons Element [Listof Element])有两个子段:

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

要将它们放入球拍中,可以分别使用firstrest

(define (length lst)
  (cond
    [(empty? lst)  ???]
    [(cons? lst)   ... (first lst) ... (rest lst) ...]))

5:这些子片段中是否有复杂数据?

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

(rest lst)是另一个[Listof Element],这很复杂。我们该如何处理?通过使用辅助功能。

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

(define (length lst)
  (cond
    [(empty? lst)  ???]
    [(cons? lst)   ... (first lst) ... (length (rest lst)) ...]))

6:利用您对长度应该如何工作的直觉以及我们之前编写的示例来填补空缺

第一个示例(length '()) = 0告诉我们,第一个???孔应填充0

(define (length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   ... (first lst) ... (length (rest lst)) ...]))

第二个孔,即第一个孔周围的...孔和其余孔的长度,要难一些。但是您对长度的直觉应该告诉您,“第一”和“其余”的“组合”列表的长度应为一个加上其余部分的长度。将其转换为代码:

(define (length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   (+ 1 (length (rest lst)))]))

我使用的系统步骤在How to Design Programs一书中进行了说明。

答案 2 :(得分:0)

欢迎Lisp,@ danny lee!

(define (length-1 lst (acc 0)) 
   (if (null? lst)
       acc
       (length-1 (cdr lst) (+ 1 acc))))

我使用名称length-1是因为Racket基本函数length确实执行了该函数应该执行的操作。 (为了不覆盖它,我选择了另一个名称。)

Ah和您调用的函数:

(define lst (list 1 3 5 8 7 3))

(length-1 lst)  ;; calls length-1 on lst defined above
;; this returns you the value 6, since this is the length of the list

我强烈推荐您The little Schemer这本书-它确切地教给您-递归思考-并提供所有与此类似的解决方案-并很好地解释了这些解决方案。很好的书!