[英]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.