1.1.1. # 递归基础

前置:Hello world | 难度:★★ | 后续:列表与递归, 回溯与控制流

递归是 Prolog 编程的核心。这一章从最简单的数学递归(阶乘)开始,逐步过渡到列表递归(list_length),确保你理解"基本情况 + 递归情况"这个基本模式。

1.2. 递归基础

递归是Prolog编程的基础。递归定义了一个谓词,它通过调用自身来解决问题。要成功使用递归,你需要定义一个基本情况(停止递归的条件)和一个递归情况(递归调用自身)。

让我们从一个简单的例子开始——计算阶乘。

1.2.1. 阶乘计算

阶乘(factorial)是一个经典的递归问题,定义为:

  • ( n! = 1 ) 当 ( n = 0 )
  • ( n! = n \times (n-1)! ) 当 ( n > 0 )

我们可以在Prolog中定义一个计算阶乘的谓词如下:

factorial(0, 1).  % 基本情况:0! = 1
factorial(N, F) :-
    N > 0,  % 确保N为正整数
    N1 is N - 1,
    factorial(N1, F1),  % 递归调用
    F is N * F1.  % 递归情况

在这个例子中,factorial/2是一个递归谓词,它计算一个整数的阶乘。factorial(0, 1)定义了基本情况,而factorial(N, F)则是递归调用的情况。

1.2.2. 运行示例

查询factorial/2谓词:

?- factorial(5, F).
F = 120.

1.3. 列表操作

在Prolog中,列表是一个重要的数据结构,递归也常用于处理列表。让我们来看几个列表操作的例子。

1.3.1. 列表长度

计算一个列表的长度是一个经典的递归问题。我们可以定义一个谓词来完成这个任务:

list_length([], 0).  % 基本情况:空列表的长度为0
list_length([_|T], L) :-
    list_length(T, L1),  % 递归调用
    L is L1 + 1.  % 递归情况:列表长度加1

1.3.2. 运行示例

查询list_length/2谓词:

?- list_length([a, b, c, d], L).
L = 4.

1.4. 总结

这一章介绍了 Prolog 的递归基础。我们从阶乘计算开始,逐步过渡到列表处理(list_length)。递归是 Prolog 中最核心的编程模式——所有需要重复操作的结构都可以用"基本情况 + 递归情况"来描述。

掌握了本章内容后,下一章将进一步深入列表递归的各种模式。

下一章预告:c3b 将深入列表递归——member/2、append/3、maplist/3、累加器模式。准备好把本章的递归基础应用到真正的列表处理中。

Copyright © zhzluke96 2020 all right reserved,powered by Gitbook该文件修订时间: 2026-06-30 16:08

results matching ""

    No results matching ""