很难避开一个问题,那就是算法,无论是面试还是平时的应用。基本的排序算法和二分搜索算法,说到算法,就要谈及算法思想,算法就是思想的表达,其中重要的一个就是递归。不断的通过参数的修改来逐渐达到目的。
一个递归少不了的三部分:
1.递归退出条件。这个是肯定的,不能结束的递归是没有用处的,无论递归多少层,总要有一层开始返回,知道输出结论。
2.逻辑之行。这也是肯定的,不执行任何操作的递归,执行多少层也是没有用的。
3.递归调用。这也是肯定的,不调用自身何谈递归。
递归条件决定什么时候返回,递归调用的方式决定递归的走向。
看一个二分查找:
bool binary_search(int data[], int left, int right, int x)
{
if(left <= right)
{
int mid = left + (right-left)/2;
if(data[mid] == x)
{
return true;
}
if(x > data[mid])
{
return binary_search(data,mid + 1, right,x);
}
if(x < data[mid])
{
return binary_search(data,left, mid - 1,x);
}
}
else
{
return false;
}
}
二分查找是在有序数列里面查找目标值,每次找中间的一个值进行比较,缩小一半的范围。
这个算法的退出条件有两个一个是找到了返回true 条件就是
if(data[mid] == x)
没有找到的条件是
else
{
return false;
}
这里逻辑部分和递归调用是在一块的,逻辑部分决定的递归的走向,如果要查找的数小于中间值则走坐标,如果大于中间数则走右边。
再来看一个二叉树的先序遍历:
void preTraverse(Node* node)
{
if(node == nullptr)
{
return;
}
Print(node->data);
preTraverse(node->left);
preTraverse(node->right);
}
先序遍历也叫先根遍历,就是根节点优先左右节点随后。这个算法就以先序遍历的顺序打印了节点。
退出条件
if(node == nullptr)
{
return;
}
递归走向,
preTraverse(node->left);
preTraverse(node->right);
先左后右,直到处理完所有的左子树才去处理右子树。
preTraverse(node->left);
执行不完是不会返回的,直到搜索到最后一个左节点才会返回,这个时候
preTraverse(node->right);
才有机会执行。