方案中的嵌套循环

时间:2012-05-07 16:21:33

标签: scheme racket

说我有例如

(define sample '("a" "b" "c"))

我将如何创建一个适用于样本的嵌套循环。

 (define (runthis a)
    (cond
    (char? (car a)) ;given that this condition is true I go on to the nested loop

    (define (work sample)
    <dosomething>
    (work (cdr sample))))

    (else (write " ")
(runthis(cdr a)))) 

这是基本嵌套循环的正确模板吗?

3 个答案:

答案 0 :(得分:3)

如果你需要嵌套循环,我建议使用for。 这是一个小而愚蠢的例子。外环贯穿 列表中的单词一次一个。如果当前单词以r开头, 然后内循环将一次打印一个字符。

#lang racket

(define (print-words-beginning-with-r words)
  (for ([word words]
        #:when (char=? (string-ref word 0) #\r))
    (for ([c word])
      (display c))
    (newline)))

(print-words-beginning-with-r '("racket" "rocks" "!"))

此输出

racket
rocks

答案 1 :(得分:1)

我没有方便的解释器,但看起来它不会运行。

我不确定“嵌套循环”究竟是什么意思,或者你试图满足的要求,但是在Scheme中不鼓励使用大量的嵌套和长函数,因为它们会影响可读性/清晰度。你想复制这种行为吗?

while(foo) {
    while(bar) {
        // Frob the fizzbits
    }
}

我会推荐这样的东西,它在功能上相同但更容易理解:

(define (inner-loop the-list)
  ; do things
)

(define (outer-loop the-list)
  (cond (char? (car a)) (inner-loop the-list)
        (else           (write " "))))

答案 2 :(得分:1)

另一种可能性是名为let,如:

(define (runthis a)
  (cond
    ((char? (car a))
     (let loop ((sample a))
       (cond 
         ((null? sample) '())
         (else (display (car sample))
           (loop (cdr sample))))))
    (else (write " "))))