【问题标题】:Idiomatic Nested looping in racket/scheme球拍/方案中惯用的嵌套循环
【发布时间】:2013-05-18 20:04:30
【问题描述】:

有没有人知道在 Racket/Scheme 中对范围内的数字进行嵌套循环的惯用方法是什么?在 Python 中,我们有:

for i in range(numb1):
    for j in range(numb2):

Racket/Scheme 中的等价物是什么?

【问题讨论】:

    标签: scheme range racket nested-loops


    【解决方案1】:

    在 Racket 中就这么简单,使用 Iterations and Comprehensions:

    (for* ([i (in-range numb1)]
           [j (in-range numb2)])
      <body of iteration>)
    

    以上内容仅适用于 Racket。相比之下,以下 sn-ps 将在任何标准 RxRS 解释器中工作 - 例如,使用一对嵌套的 do

    (do ((i 0 (+ i 1))) ((= i numb1))
      (do ((j 0 (+ j 1))) ((= j numb2))
        <body of iteration>))
    

    另一种选择:使用显式递归并命名为let

    (let loop1 ((i 0))
      (cond ((< i numb1)
             (let loop2 ((j 0))
               (cond ((< j numb2)
                      <body of iteration>
                      (loop2 (+ j 1)))))
             (loop1 (+ i 1)))))
    

    最后,您始终可以执行以下操作,详情请参阅“嵌套映射”部分下的SICP

    (define (range start stop)
      (let loop ((i (- stop 1))
                 (acc '()))
        (if (< i start)
            acc
            (loop (- i 1) (cons i acc)))))
    
    (for-each
     (lambda (i)
       (for-each
        (lambda (j)
          <body of iteration>)
        (range 0 numb2)))
     (range 0 numb1))
    

    【讨论】:

    • 作为一个小 P.S.奥斯卡的出色回答:在球拍中,最好是功能性的。因此,您可能会发现自己使用返回值的for 的变体,例如for/listfor/vector 或其他。这些建立在for/fold 之上,这是最通用的“迭代和累积”形式。当然,当你需要做一些事情只是为了效果(比如 I/O),那么你可能会使用普通的for;加上它最容易理解,所以 Óscar 用它作为例子很好。
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2016-08-07
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多