递归
递归设计经验
~找重复(子问题)
划分子问题
  1.找到一种划分方法
  2.找到递推公式或者等价转换~找重复中的变化量——>参数
变化的量通常作为参数~找参数变化驱使——>设计出口
练习策略
~循环该递归
~经典递归
~大量练习,总结规律,掌握套路
~找到感觉,挑战高难度
递归基础练习
· 求阶乘
using namespace std;
int factorical(int x) {
    if (x==1) return 1;
    return x*factorical(x-1);
}
int main()
{
    int x;
    cin>>x;
    cout<<factorical(x)<<endl;
    return 0;
}· 打印i~j
using namespace std;
void print(int i, int j) {
    if (i>j)
        return;
    cout<<i<<' ';
    print(i+1,j);
}
int main()
{
    int i,j;
    cin>>i>>j;
    print(i,j);
    return 0;
}· 数组求和
using namespace std;
int sum(int array[],int begin,int end)
{
    if (begin==end) return array[end];
    else return array[begin]+sum(array,begin+1,end);
}
int main()
{
    int array[10]={1,2,3,4,5,6,7,8,9,10};
    cout<<sum(array,0,9);
    return 0;
}· 翻转字符串
using namespace std;
string flip_string(string str,int index)
{
    if (index==0) return ""+str[0];
    return str[index]+flip_string(str,index-1);
}
int main()
{
    string s=flip_string("abcd",3);
    cout<<s<<endl;
    return 0;
}不知道为什么出现了乱码问题,求大神指点。
· 斐波那契数列
using namespace std;
int Fibonacci(int num)
{
    if (num==1||num==2) return 1;
    return Fibonacci(num-1)+Fibonacci(num-2);
}
int main()
{
    cout<<Fibonacci(10)<<endl;
    return 0;
}· 最大公约数
using namespace std;
int gcd(int m,int n)
{
    if (n==0) return m;
    return gcd(n,m%n);
}
int main()
{
    int m,n;
    cin>>m>>n;
    int num=gcd(m,n);
    cout<<num<<endl;
    return 0;
}· 插入排序改递归
using namespace std;
int array[10] = {9, 7, 5, 3, 1, 2, 4, 6, 8, 10};
void insertsort(int array[], int k) {
    //出口条件判断
    if (k == 0) return;
    //对前k-1个元素排序
    insertsort(array, k - 1);
    //把位置k的元素插入到前面的部分
    int x = array[k];
    int index = k - 1;
    while (index >= 0 && x < array[index]) {
        array[index + 1] = array[index];
        index--;
    }
    array[index + 1] = x;
}
int main() {
    insertsort(array, 10);
    for (int i = 0; i < 10; ++i) {
        cout << array[i] << ' ';
    }
    return 0;
}· 汉诺塔
using namespace std;
void Hanoi(int N, string from, string to, string help) {
    if (N == 1) {
        cout << "move " << N << " from " << from << " to " << to << endl;
        return;
    }
    //先把前N-1个盘子挪到辅助空间上去
    Hanoi(N - 1, from, help, to);
    //N可以顺利到达target
    cout << "move " << N << " from " << from << " to " << to << endl;
    //让N-1从辅助空间回到源空间上
    Hanoi(N - 1, help, to, from);
}
int main() {
    Hanoi(3, "A", "B", "C");
    return 0;
}









