में एक सूची का विभाजन करना मैं एक आवेदन में रैकेट में काम कर रहा हूं मुझे संख्याओं की एक सूची लेने और सूची को लगातार संख्याओं की उप-सूचियों में विभाजित करने की आवश्यकता है: (वास्तव में, मैं वास्तव में एक नंबर और कुछ डेटा से मिलकर जोड़े विभाजन है, लेकिन सिद्धांत एक ही है)रैकेट
यानी अगर मेरे प्रक्रिया chunkify
तो कहा जाता है:।
(chunkify '(1 2 3 5 6 7 9 10 11)) -> '((1 2 3) (5 6 7) (9 10 11))
(chunkify '(1 2 3)) -> '((1 2 3))
(chunkify '(1 3 4 5 7 9 10 11 13)) -> '((1) (3 4 5) (7) (9 10 11) (13))
(chunkify '(1)) -> '((1))
(chunkify '()) -> '(())
आदि
मैं के साथ आए हैं रैकेट में निम्नलिखित:
#lang racket
(define (chunkify lst)
(call-with-values
(lambda()
(for/fold ([chunk '()] [tail '()]) ([cell (reverse lst)])
(cond
[(empty? chunk) (values (cons cell chunk) tail)]
[(equal? (add1 cell) (first chunk)) (values (cons cell chunk) tail)]
[else (values (list cell) (cons chunk tail))])))
cons))
यह सिर्फ ठीक काम करता है, लेकिन मैं रैकेट की अभिव्यक्ति दी सोच रहा हूँ अगर वहाँ ऐसा करने का एक और अधिक सरल आसान तरीका नहीं है, "कॉल-साथ-मूल्यों" से छुटकारा पाने के किसी तरह और प्रक्रिया आदि में सूची को उलट करने की आवश्यकता, शायद कुछ अलग तरीके से अलग है।
मेरा पहला प्रयास "The Little Schemer" में एक कलेक्टर के साथ एक पैटर्न पर बहुत शिथिल आधारित था और कहा कि और भी कम ऊपर से स्पष्ट था:
(define (chunkify-list lst)
(define (lambda-to-chunkify-list chunk) (list chunk))
(let chunkify1 ([list-of-chunks '()]
[lst lst]
[collector lambda-to-chunkify-list])
(cond
[(empty? (rest lst)) (append list-of-chunks (collector (list (first lst))))]
[(equal? (add1 (first lst)) (second lst))
(chunkify1 list-of-chunks (rest lst)
(lambda (chunk) (collector (cons (first lst) chunk))))]
[else
(chunkify1 (append list-of-chunks
(collector (list (first lst)))) (rest lst) list)])))
मैं क्या देख रहा हूँ कुछ सरल, संक्षिप्त और सरल है।
यह "मेरे कोड की समीक्षा करें" नहीं है, न कि "मेरे कोड में क्या गलत है", इसलिए मुझे लगता है कि www.codereview.stackexchange.com –