日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Clojure语法学习-循环

發(fā)布時(shí)間:2025/4/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Clojure语法学习-循环 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

do和塊語(yǔ)句

在Scala中,花括號(hào){}括起來(lái)的語(yǔ)句構(gòu)成一個(gè)block,它的值就是最后一個(gè)語(yǔ)句的值。

scala> val a = {| println("a")| 1} a a: Int = 1

{println("a"); 1}的值為1。

在Clojure中,有時(shí)需要使多個(gè)form組成一個(gè)block, 這個(gè)block的值是最后一個(gè)form的值。這時(shí)候就用do

user=> (def a (do (println "a") 1)) a #'user/a user=> a 1

do takes any number of forms, evaluates them all, and returns the last.

do接受任意多的form作為參數(shù),對(duì)它們分別求值,然后返回最后一個(gè)form的值。

?循環(huán)

有哪些要素才能構(gòu)成一個(gè)循環(huán)?

在Java中

  • 首先,我們需要提供一個(gè)在每次循環(huán)中都會(huì)被執(zhí)行的語(yǔ)句——循環(huán)體
  • 如果不是無(wú)限循環(huán),我們需要提供退出條件,當(dāng)這個(gè)條件滿(mǎn)足時(shí),不再循環(huán)。
  • 在Clojure中

  • 首先,我們需要提供一個(gè)在每次循環(huán)中都會(huì)被執(zhí)行的語(yǔ)句——循環(huán)體
  • 我們需要提供循環(huán)條件。它這個(gè)條件滿(mǎn)足時(shí),繼續(xù)下一次循環(huán)。
  • 也就是說(shuō)Java需要我們告訴它什么時(shí)候退出循環(huán),而Clojure需要我們告訴它何時(shí)繼續(xù)循環(huán)。

    Java的for循環(huán)是這樣的

    for(int i = 0; i < 10; i++)System.out.println(i);

    可以認(rèn)為 i< 10, i++以及System.out.println(i)構(gòu)成了循環(huán)體。退出條件為i<10。

    while循環(huán)與for循環(huán)的不同之處在于while無(wú)法聲明只在循環(huán)內(nèi)部使用的變量。在上邊的for循環(huán)中, i只在循環(huán)內(nèi)部使用。如果我們想讓while有類(lèi)似的功能(當(dāng)然,while沒(méi)這功能),那么while需要接受一個(gè)初始化語(yǔ)法,變成

    while(int i = 0)(i < 10){println(i);i++; }

    ?在Clojure中,同樣可以以binding的形式提供初始化語(yǔ)句, 以及提供循環(huán)體。這通過(guò)loop這種form來(lái)實(shí)現(xiàn)

    (loop [bindings *] exprs*)

    這就類(lèi)似前邊這個(gè)加強(qiáng)版的while。同時(shí),在while循環(huán)中需要break來(lái)打破循環(huán); 在Clojure中,我們需要一種form來(lái)繼續(xù)循環(huán),這就是recur。可以認(rèn)為Java的循環(huán)是主動(dòng)的,而Clojure中的是被動(dòng)的,你必須在代碼中驅(qū)動(dòng)它前進(jìn)。

    (loop [a 0] (if (< a 10) (do (println a) (recur (+ 1 a)))))

      recur使得程序重新開(kāi)始執(zhí)行l(wèi)oop。但是如何程序中是簡(jiǎn)單地重新執(zhí)行l(wèi)oop,它就只是原地踏步,因?yàn)樗械慕壎ǘ际冀K是初始值。所以recur不僅轉(zhuǎn)變了程序的執(zhí)行流,而且修改了loop開(kāi)始的綁定。即,recur使得loop開(kāi)始對(duì)a的綁定變成了(+ 1 a)。

    假如,我們?cè)趌oop開(kāi)始的時(shí)候多提供一個(gè)綁定

    (loop [a 0 b 1] (if (< a 10) (do (println a) (recur (+ 1 a)))))

      REPL就會(huì)告訴我們提供給recur的參數(shù)個(gè)數(shù)不對(duì)

    CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 2 args, got: 1

    實(shí)際上,recur不僅可以用于loop,也可以用于函數(shù),它使得函數(shù)被重新執(zhí)行。

    舉個(gè)書(shū)上的例子

    (defn countdown [result x] (if (zero? x) result (recur (conj result x) (dec x))))

    執(zhí)行(count down [] 5)會(huì)輸出返回值[5 4 3 2 1]

    這種代碼怎么看著這么眼熟呢?這不就像是尾遞歸嗎?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/devos/p/4207707.html

    總結(jié)

    以上是生活随笔為你收集整理的Clojure语法学习-循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。