递归和归纳证明之间的关系是什么?
我们说fn(n)
,
递归fn(n)
自称为base condition
;
归纳是在base condition
满足时,尝试证明(base case + 1)
也是正确的。
似乎递归和归纳是在不同的方向。一个从n
开始到base case
,另一个从base case
开始到infinite
。
有人可以详细解释这个想法吗?
答案 0 :(得分:11)
递归和归纳是非常相同的事情!如果您使用具有依赖类型的编程语言(例如Agda),这一点就变得很明显,但是在没有它们的情况下可以在某种程度上进行演示。
请记住,由于Curry-Howard correspondence,类型是命题,程序是证明。当你编写类型Nat -> Nat
的函数(我将使用Haskell表示法)时,你试图证明,给定一个自然数,你的程序将终止并产生另一个自然数。现在我们可能有这样的定义:
f 0 = 1
f (1 + n) = n * f n
既是f
的递归定义,也是同时终止它的归纳证明!
您可以通过以下方式将其作为证据阅读:
让我们证明f x终止于任何x。
f 0
为常量,因此终止。 f n
个终止,f (1 + n)
也会终止(因为它调用的所有函数都会终止)。注意,由于递归不限于递减其计数器的函数,因此归纳也不限于自然数。还存在结构归纳,对应于结构递归,这两者在数学/编程中都非常流行。当试图在更复杂的数据结构(列表/树/等)上证明事物/定义函数时,将使用这些。
现在,要解决您对"方向的关注"递归/归纳。考虑"需求方向是有帮助的。和"供应方向"在这里,相反。
定义递归函数时,需求(方法调用)从较大的值流向基本情况。另一方面,供应(返回值)从基础情况流向较大的参数值。 " definedness"是另一种思考供给的方式。它从基本情况开始,并通过递归情况传播到无穷大。
现在,当您进行归纳证明时,定理就是您的供应,而目标是您的需求。您可以从基本情况中得出一个定理T 0,然后使用感应情况改进到大到很大的T n:您的电源从0流向无穷大。现在如果你有一个目标G n,你可以使用归纳步骤制作一个较小的目标G(n-k)直到你达到零。这样你的需求从n变为0。
正如您所看到的,供应方向是无限的"在这两种情况下,需求方向都是“零”。在这两种情况下。
您还可以在不改变其含义的情况下反转归纳和递归描述中的明显顺序:
归纳是指何时证明P n持有你需要首先通过重复应用归纳案例将目标减少到P 0,然后使用基本案例证明最终目标。
类似地,递归是指您首先定义基本案例,然后根据先前的案例定义其他值。看,方向很容易交换!