簡體   English   中英

Racket-sdp 中最接近 for-loop 的是什么?

[英]What is the closest equivalent to a for-loop in Racket-sdp?

遞歸是在 Racket 方言 sdp(“Schreibe dein Programm”)中編寫類似 for 循環的唯一方法嗎? 其中“(for)”不是一回事,或者是否有更“有效”或更簡單的方法來做到這一點?

在 Racket-sdp 代碼中,與 C++ 循環for(i = 0, i < 100, i++)最接近的等效項是什么?

到目前為止,我是如何做到的:

(: my-loop (natural -> %a))
(define my-loop
    (lambda (i)
        (cond
            [(< i 100) (my-loop (+ i 1))] ; <-- count up by one till 99 is reached
            [else "done"] ; <-- end
        )))

(my-loop 0)

編輯:

這更像是一個普遍的問題。 如果我要寫一個包含通用 function 的 raket 庫,可以這樣使用:

(for 0 (< i 100) (+ i 1) (func i))

在我的程序中,這是一個與給定的 function 一起運行的 for 循環,因為它是“主體”,是否有一種方法可以正確地實現它?

[這里提到的課程的教授。]

遞歸確實是在我們追求的 Racket 方言中表達迭代計算的唯一方式。 (是的,這是設計使然。)

不過,高階函數(和遞歸)提供了創建自己的“類似循環的控制結構”所需的一切。 以下面的 HOF 為例,它模擬了一個repeat-until循環:

(: until ((%a -> boolean) (%a -> %a) %a -> %a))
(define until
  (lambda (done? f x)
    (if (done? x)
        x
        (until done? f (f x)))))

請注意, until function 是尾遞歸的。 你可以期望它在運行時確實表現得像一個循環——一個聰明的編譯器甚至會使用普通的jump指令來翻譯這樣一個 function。 (我們將在接下來的第 12 章中討論上述內容。)

你可以做一個高階for循環。 這是一個簡單的例子:

(define (for start end f)
  (define (loop i)
    (when (< i end)
      (f i)
      (loop (+ i 1))))
  (loop start))

(for 0 10 (λ (i) (displayln i)))

如果您使用next function 而不是(+ i 1)並使用while-predicate? function 而不是(< i end)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM