递归与回溯
递归:函数调用自己。(可终止)
格式:if(是基本情况吗)
直接求解,并返回结果
else(是另一种基本情况吗)
直接求解,并返回结果
递归情况
else
返回(进行某些处理步骤,然后是针对更小规模问题的函数递归调用)
递归与迭代:当一个问题很明显可以分解为类似或相同的更小的小问题,同时有终止条件时,采用递归。而迭代的终止条件是迭代条件被证明不正确,同时迭代可以无限循环,不需要额外的空间。
可以用递归解决的问题模型:斐波那契数列;阶乘;合并排序;快速排序;二分搜索;树的遍历及树的其他问题;图的遍历;动态规划;分治算法;汉诺塔问题;回溯;
例:给出一个数组,判断该数组是否是单调递增序列
解:int isArrayInSortedOrder(int A[],int n){
if(n==1)
return 1;
return (A[n-1]<=A[n-2]?0:isArrayInSortedOrder(A,n-1);
回溯算法举例:二进制串;生成的k进制串;背包问题;广义字符串;哈密尔顿回路;图着色问题;
例:求生成的所有长度为n的二进制串,假设A[0...n-1]是一个大小为n的一维数组。
解:void Binary(int n){
if(n<1)
printf("%s",A);
else{
A[n-1]=0;
Binary(n-1);
A[n-1]=1;
Binary(n-1);
}
}
原文:https://www.cnblogs.com/gtz-gdufs/p/10660289.html