递归_CH0302_递归实现组合型枚举_递归算法正确性证明范例

版权声明:本文为博主原创作品, 转载请注明出处! https://blog.csdn.net/solider98/article/details/83276758

点此打开题目页面

先给出AC代码, 然后给出程序正确性的形式化证明

//CH0302_递归实现组合型枚举
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int n, m;
vector<int> choosn;
void solve(int cur){
	if(choosn.size() + (n - cur + 1) < m) return;
	if(choosn.size() == m){
		for(int i = 0; i < m; ++i) cout << choosn[i] << " "; cout <<endl;
		return;
	}
	choosn.push_back(cur), solve(cur + 1), choosn.pop_back();
	solve(cur + 1);
}
int main(){
	scanf("%d %d", &n, &m); 
	solve(1);
	return 0;
}

程序正确性的形式化证明:

定义集P_{i} = { x | x为一次solve(i)的调用执行, 满足进入调用后的初始choosn[0...choosn.size() - 1]严格递增且对应{1,...,i - 1}的一个子集且choosn.size() <= m }

    归纳起点: 对于P_{n}中的元素a, 根据代码逻辑易知, 设集S(可能为空)为当前choosn对应集合和集{n}的所有子集的并集构成的集合, 若S中不存在基数为m的集合, 那么程序直接放回上级调用者, 否则程序按照字典序递增的方式打印S中所有基数为m集合, 并且每个集合按照元素递增打印在单独行. 

    递推: 假设对于P_{k}(2 =< k <= n)中的元素上述结论成立, 容易证明其对于P_{k - 1}中的元素也是成立的

    综上述, 对于P_{1}中的元素上述结论成立, 从而程序正确性的得证

猜你喜欢

转载自blog.csdn.net/solider98/article/details/83276758
今日推荐