【转载】论递归算法的数学原理

原文链接: https://www.acwing.com/file_system/file/content/whole/index/content/6489818/

  想必很多同学在接触递归算法的时候都会很困惑,比如归并排序,为什么下面的代码可以将一个序列排好序呢?

  今天突然发现,递归过程的本质就是数学归纳法!我们再刨根问底一下,数学归纳法的正确性又源自于什么呢?答案就是:数学归纳法是一个公理,只有满足数学归纳法的数集才是我们平时用到的自然数集!

  所以,递归过程的正确性是个公理!这也是为什么我们对递归很困惑的原因了。

  接下来以归并排序为例,我们用数学归纳法来证明其正确性。

  首先当序列长度小于等于1的时候,序列有序,成立。

  假设对于任意序列长度小于$n$的序列, merge_sort(l, r) 都能将序列排好序。

  那么我们证明对于任意序列长度等于$n$的序列, merge_sort(l, r) 也可以将序列排好序。

  我们再来看 merge_sort 这个函数:

  图中红色框起来的部分,根据归纳假设, [l, mid] 和 [mid + 1, r] 的长度都小于$n$,所以 merge_sort 函数可以将其排好序。

  然后左右两个有序序列,通过二路归并算法,就可以合并成一个有序序列了,因此对于当前长度为$n$的区间, merge_sort 也可以将其排好序。证毕。

  所以对于任意自然数长度的区间, merge_sort() 都可以将其排好序。

posted @ 2022-09-09 16:43  onlyblues  阅读(65)  评论(0编辑  收藏  举报
Web Analytics