📜  LISP 中的循环

📅  最后修改于: 2022-05-13 01:55:14.541000             🧑  作者: Mango

LISP 中的循环

循环允许在某些条件为真时重复执行一组指令。 LISP 提供以下类型的循环:

1. dotimes 循环:

dotime 循环允许以固定次数执行指令。
句法:

(dotimes( variableName numberOfIterations ) (
  expressions 
))

在哪里,

  • variableName =>变量名,可用于获取当前迭代次数
  • numberOfIterations =>总迭代次数
  • 表达式=>要在每次迭代中执行的语句

例子:

Lisp
(dotimes (a 4)
  (print a))
(write-line "")


Lisp
(dotimes (i 7)
   (if (> i 5)
       (return)
       (print i))
    )
(write-line "")


Lisp
(defvar n 3)
(loop
    (print n)
    (setq n (+ n 1))
    (when (> n 6) (return n))
)
(write-line "")


Lisp
; initialize x=12, execute instructions, 
; increment it by 3 and perform iteration until it is less than 25
(loop for x from 12 to 25 by 3 do
    (print x)
)
(write-line "")


Lisp
(do ((a 0 (+ 2 a))
   (b 20 ( - b 2)))
   ((= a b)(- a b))
   (format t "~% a = ~d  b = ~d" a b)
)
(write-line "")


Lisp
(defvar nums `(9 5 2 3))
(dolist (item nums)
  (print item)
)
(write-line "")


输出:

如果满足某个条件,您也可以从循环中返回

Lisp

(dotimes (i 7)
   (if (> i 5)
       (return)
       (print i))
    )
(write-line "")

在这里,循环设置为迭代 7 次,但是,当值变得超过 5 时,循环会因为满足条件而停止。
输出:

2.循环:

循环结构允许重复执行一些语句,直到找到返回语句。

句法:



( loop   
  (expressions)
  ( when (condition) (return returnValue))
)

在哪里,

  • 表达式=>要在每次迭代中执行的语句
  • 条件=>指定何时退出循环的条件
  • returnValue =>要返回的值

例子:

Lisp

(defvar n 3)
(loop
    (print n)
    (setq n (+ n 1))
    (when (> n 6) (return n))
)
(write-line "")

这里,n 被打印并递增,直到它大于 6。
输出:

3.循环:

for 结构的循环类似于Java、c++ 等流行语言中的 for 循环。它也可以用于遍历列表和其他数据结构。

句法:

( loop for variableName from startValue to endValue by changeValue do
   (expressions)
)

在哪里,

  • variableName =>变量名,可用于获取当前迭代中变量的值。
  • startValue =>变量的初始值
  • endValue =>变量的结束值(上次迭代后)
  • changeValue =>指定每次迭代后增加或减少多少值
  • 表达式 =>要在每次迭代中执行的语句

例子:

Lisp

; initialize x=12, execute instructions, 
; increment it by 3 and perform iteration until it is less than 25
(loop for x from 12 to 25 by 3 do
    (print x)
)
(write-line "")

输出:



4. 做:

do 构造允许结构化形式的迭代。
句法:

(do ((variable_1    value_1   updated-value_1)
      (variable_2   value_2   updated-value_2)
      (variable_3   value_3   updated-value_3)
   ...)
   (test return_value)
   (s-expressions)
)

在哪里,

  • variable_1 =>第一个变量
  • value_1 =>第一个变量的初始值
  • updated-value_1 =>指定每次迭代后如何更新 variable_1。
  • variable_2 =>第二个变量
  • value_2 =>第二个变量的初始值
  • updated-value_2 =>指定每次迭代后如何更新 variable_2。 ... 类似直到variable_n
  • 测试 =>指定何时停止循环的条件
  • 返回值 =>迭代结束时返回的值
  • 表达式 =>要在每次迭代中执行的其他语句

评估每个变量的初始值并将其绑定到相应的变量。每个子句中的更新值与一个可选的更新语句有关,该语句指示如何在每次迭代中更新变量。
每次迭代都会执行测试,如果测试表达式的结果为非空或真值,则计算并返回返回值。
如果指定了最后一个可选的 s-expression(s),则它们在每次迭代时执行,而测试表达式结果为真。
例子:

Lisp

(do ((a 0 (+ 2 a))
   (b 20 ( - b 2)))
   ((= a b)(- a b))
   (format t "~% a = ~d  b = ~d" a b)
)
(write-line "")

输出:

5. 列表:

dolist 结构提供了一种遍历列表的简单方法。

句法:

(dolist (listItemVariable list)
   (expressions)
) 

在哪里,

  • listItemVariable =>在每次迭代期间保存每个列表项的值
  • list =>要遍历的列表
  • 表达式 =>要在每次迭代中执行的语句

例子:

Lisp

(defvar nums `(9 5 2 3))
(dolist (item nums)
  (print item)
)
(write-line "")

输出:

参考:

  • LISP 中循环的官方文档