[英]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.