簡體   English   中英

球拍在列表中的“ n”個元素的打印長度

[英]Racket print length of “n” elements in a list

我需要一些幫助來理解尾遞歸

    #lang racket

   (define (lista x)
   (printf(length(cons x (lista (read)))))
   )

   (lista (read))

我不知道如何結束鏈表的循環,然后獲取長度並打印此數字。

例如,如果我有一個輸入

  2
  1
  3
  5
  7
  5
  10

它必須打印7,但是編譯器始終會顯示消息超時,因此我不知道我是否在正確讀取輸入內容,或者還有其他方法?

您正在做的事情沒有意義(我將在下面解釋原因)。 如果使用length ,則可以立即返回列表的長度。 之所以具有無限循環,是因為您沒有停止條件(即,當列表為null?時,請結束遞歸)。

我想這是一項作業,需要您手動執行,因此不使用length

(define (lngth lst)
  (if (null? lst) ; Did we checked the whole list already?
      0           ; This will put an end to the recursion !
      (+ 1        ; Tail recursive call, we add 1 because we call ourselve recusrively with the cdr of the list (hence with a list that is one shorter)
         (lngth (cdr lst)))))

現在您可以調用此過程, (lngth '(1 2 3 4 5))將返回5。


(define (lista x)
  (printf
   (length
    (cons x 
          (lista (read))))))

您的嘗試有一些問題。 最大的問題是它缺少停止條件,這是循環不斷的原因(循環不斷提示用戶輸入)。 現在,當您調用lista時,由於(define (lista x) ... (cons x (lista ...)))您將始終會遇到一個遞歸調用。

就像我在上面說的,其余的代碼實際上沒有任何意義。 您使用cons而不是cdr遍歷列表,並且使用length而不是為列表的當前元素添加一個(+ 1 (recursive call))

您在遞歸中沒有停止條件,這就是為什么它不打印長度就繼續的原因。 例如,您可以通過查找某個輸入(例如“ length”)來打印長度來中斷。

#lang racket

(define (get-length-of-input)
  (display "Enter a number or get the length (length for length)")
  (let input-loop ((result '()))
    (define input (read-line))
    (cond [(number? (string->number input)) 
           (input-loop (cons input result))]
          [(string=? input "length") 
           (displayln (length result))]
          [else (displayln "unknown input") 
                (input-loop result)])))

; Start the procedure
(get-length-of-input)

為了使其尾部遞歸,在此使用了一個具名的let的迭代循環。 named-let用初始值(空列表'() )初始化循環並自動開始。

然后進行案例分析(輸入是數字,字符串“ length”還是其他?)。 如果是數字(通過嘗試將輸入字符串轉換為數字進行檢查),則將該數字添加到局部變量result並繼續循環。 如果輸入為“長度”,則將打印長度並停止程序。 否則,顯示“未知輸入”,並且循環繼續。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM