递归

递归

递归设计经验

~找重复(子问题)

	划分子问题
	1.找到一种划分方法
	2.找到递推公式或者等价转换

~找重复中的变化量——>参数

	变化的量通常作为参数

~找参数变化驱使——>设计出口

练习策略

~循环该递归
~经典递归
~大量练习,总结规律,掌握套路
~找到感觉,挑战高难度

递归基础练习

· 求阶乘

#include <iostream>
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

#include <iostream>
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;
}

· 数组求和

#include <iostream>
#include <cstring>
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;
}

· 翻转字符串

#include <iostream>
#include <string>
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;
}

不知道为什么出现了乱码问题,求大神指点。

· 斐波那契数列

#include <iostream>
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;
}

· 最大公约数

#include <iostream>
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;
}

· 插入排序改递归

#include <iostream>

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;
}

· 汉诺塔

#include <iostream>

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;
}
posted @ 2019-04-15 08:05  AlexKing007  阅读(90)  评论(0编辑  收藏  举报