是否有內置過程來檢查方案(R5RS)中的列表是否循環?何時是循環列表(每個定義)?我試圖找到一些程序來檢查它,以及它是如何實現的,但我一直沒有找到。檢查列表是否循環的過程(方案)
1
A
回答
2
如果尾部(最後一個元素)的cdr
指向列表的開頭,則列表爲circular per definition。但是,您也可以有一個圓形列表,尾部的cdr
指向列表中的任意元素。 A good algorithm檢測循環列表是烏龜和兔子算法。示例實現在this page處給出。
的代碼如下(信貸以上鏈接的頁面的作者):
編輯:我修改了代碼,因爲它包含一個錯誤由Sylwester指出。
(define (has-cycle-h slow-ls fast-ls)
(cond
((null? fast-ls) #f)
((null? (cdr fast-ls)) #f)
((eq? slow-ls fast-ls) #t)
(else (has-cycle-h (cdr slow-ls) (cddr fast-ls)))))
(define (has-cycle? ls)
(cond
((null? ls) #f)
(else (has-cycle-h ls (cdr ls)))))
;; Create cyclic list
(define l (cons 1 (cons 2 (cons 3 (cons 4 '())))))
(set-cdr! (cdr (cdr (cdr l))) l)
;; Results in:
;+---+ +---+ +---+ +---+
;| 1 +--->| 2 +-->| 3 +--->| 4 |
;+-+-+ +---+ +---+ +-+-+
;^ |
; | |
; +-------------------------+
(has-cycle? l) ; Evaluates to #t
;; Create list
(define l (cons 1 (cons 2 (cons 3 (cons 4 '())))))
;; Make it circular by pointing the tail to the second element.
(set-cdr! (cdr (cdr (cdr l))) (cdr l))
;; Results in:
;+---+ +---+ +---+ +---+
;| 1 +--->| 2 +-->| 3 +--->| 4 |
;+---+ +-+-+ +---+ +-+-+
; ^ |
; | |
; +----------------+
(has-cycle? l) ; Evaluatores to #t
; Regular list
(has-cycle? '(1 1 1 1 1 1 1)) ; Evaluates to #f
沒有用於檢測循環列表的BIF。
1
在SRFI 1中有circular-list?
謂詞。SRFI 1中循環列表的定義是:「循環列表是一個值,使得對於每個n> = 0,cdr^n(x)是一對。這意味着沒有結束的名單。第一對圓形列表不需要是循環的一部分。最終通過跟隨cdrs達到一個週期就足夠了。
SRFI 1對非圓列出這樣的描述:
(not (circular-list? x)) = (or (proper-list? x) (dotted-list? x))
SRFI 1是不是在R5RS本身,但我知道的所有實現配SRFI 1包括在內。請注意,如果srfi1在運行時中實現,則來自srfi 1的circular-list?
謂詞可能比龜與兔算法的Scheme實現更快。基準你的實現選擇,以找出你的實現如何表現。
相關問題
- 1. 通過表單元素循環並檢查是否需要
- 2. 檢查列表中是否存在值 - 比循環更好的方式?
- 3. Python檢查目錄是否存在for循環和列表
- 4. for循環檢查是否存在散列表值不迭代
- 5. 方案:比較/檢查2個列表是否相等
- 6. PHP無限循環過程;這是好的解決方案嗎?
- 7. 檢查是否有其他循環
- 8. 檢查是否從函數與循環
- 9. For循環檢查值是否相等
- 10. 檢查Wordpress循環是否有帖子
- 11. 在循環中檢查count--是否取消循環?
- 12. 內置檢查列表遏制方案
- 13. 通過兩個視圖循環檢查是否相等
- 14. 通過變量循環檢查是否定義
- 15. 如何獲取指定進程的dll列表並通過循環來檢查是否存在某個函數
- 16. 檢查列表中的值。在循環內部還是外部循環?
- 17. 在Chicken方案中將列表轉換爲循環列表?
- 18. 檢查列表中的所有元素在方案中是否相同
- 19. 檢查程序是否卡在循環中
- 20. 如何檢查鏈表是否在Java中有循環?
- 21. 是否有URL方案列表?
- 22. 通過循環列表循環Java
- 23. 一個解決方案檢查每個表格是否爲空
- 24. 是否有關於Gson「循環引用」的解決方案?
- 25. 蟒列表在子過程for循環
- 26. 性能 - 在使用foreach循環之前檢查列表是否爲空
- 27. Django - 循環模板列表以檢查值是否存在,稍後顯示
- 28. 方案函數來確定所述列表是否遵循圖案
- 29. 方案中可以檢查列表是否正確或不正確?
- 30. 檢查循環
'(EQ?(車慢-LS)(汽車快速-LS))'似乎是錯誤的。它應該是'(eq?slow-ls fast-ls)'。用''(#f #f #f)' – Sylwester 2015-03-25 12:22:01
試試看,這似乎是真的。我只是複製粘貼的代碼。我會更新!謝謝。 – 2015-03-25 12:46:23