📜  LISP 中的循环结构(1)

📅  最后修改于: 2023-12-03 14:44:00.757000             🧑  作者: Mango

LISP 中的循环结构

LISP 是一种基于函数式编程的语言,与其他语言不同,它使用递归代替了循环。然而,LISP 也提供了一些循环结构来操作数据。本篇文章将介绍 LISP 中的循环结构,包括 dodotimesdolistloop

do 循环

do 循环可以使用一个或多个变量来循环遍历一个代码块。这个循环结构类似于 C 语言中的 for 循环。

(do ((var1 init1 step1)
     (var2 init2 step2)
     ...
     (varN initN stepN))
    (test-form result-form*)
  body-form*)
  • var1 - 第一个变量名称。
  • init1 - 第一个变量的初始值。
  • step1 - 第一个变量的步长。
  • test-form - 执行每次迭代前评估的表达式。
  • result-form - 能返回多个值的表达式。
  • body-form - 循环体内执行的代码块。

示例代码:

(do ((i 0 (+ i 1)))
  ((> i 10))
  (print i))

输出结果:

0
1
2
3
4
5
6
7
8
9
10

在这个例子中,i 的初始值为 0,每次迭代都会增加 1,直到 i 的值大于 10。在每次迭代中,i 的值都会被输出。

dotimes 循环

dotimes 循环可以用来迭代一个整数范围内的代码块。它只需要一个变量:循环计数器。这个循环结构类似于 Python 中的 for 循环。

(dotimes (var count-expr)
  body-form*)
  • var - 循环计数器的名称。
  • count-expr - 迭代次数。
  • body-form - 循环体内执行的代码块。

示例代码:

(dotimes (i 10)
  (print i))

输出结果:

0
1
2
3
4
5
6
7
8
9

在这个例子中,i 的值被设置为 0,然后每次增加 1,直到 i 的值等于 10。在每次迭代中,i 的值被输出。

dolist 循环

dolist 循环可以用来迭代一个列表中的代码块。它需要两个参数:循环计数器和一个列表。

(dolist (var list-expr)
  body-form*)
  • var - 循环计数器的名称。
  • list-expr - 要迭代的列表。
  • body-form - 循环体内执行的代码块。

示例代码:

(dolist (i '(1 2 3 4 5))
  (print i))

输出结果:

1
2
3
4
5

在这个例子中,i 的值被设置为第一个元素 1,然后每次指向下一个元素,直到所有元素都被迭代。在每次迭代中,i 的值被输出。

loop 循环

loop 循环是 LISP 中最通用和最灵活的循环结构。它有非常完整的语法和庞大的功能集。使用 loop 可以实现其他循环结构所不能的复杂算法。

(loop [keyword [[var init-expr [step-expr]]* |
                 (while test-expr) |
                 (until test-expr) |
                 (for var in list-expr [+ | - count-expr])]+
        [[finally form]+]])
  body-form*)   
  • keyword - 控制迭代、流程和变量赋值的关键字。
  • var - 循环变量的名称。
  • init-expr - 循环变量的初始值。
  • step-expr - 循环变量的步长。
  • test-expr - 布尔表达式,控制循环的终止条件。
  • list-expr - 包含不同值的列表。
  • count-expr - 循环次数。
  • finally-form - 如果有的话,是在循环结束后执行的表单。
  • body-form - 循环体内执行的代码块。

示例代码:

(loop for i below 10
      do (print i))

输出结果:

0
1
2
3
4
5
6
7
8
9

在这个例子中,循环变量 i 的初始值为 0,每次增加 1,直到次数小于 10。在每次迭代中,i 的值被输出。

以上是 LISP 中的循环结构,开发者可以根据自己的需求选择相应的循环结构。