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、累加器模式。准备好把本章的递归基础应用到真正的列表处理中。