zoukankan      html  css  js  c++  java
  • 递归

    递归

    递归设计经验

    ~找重复(子问题)

    	划分子问题
    	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;
    }
    
  • 相关阅读:
    《动手能力强与技术水平低》(2009/12/14)
    《为什么程序员被喻为“IT农民工”》(2009/12/12)
    对于关键字Ref和Out的理解
    2008世界500强排名(1100位)
    Javascript取select的选中值和文本
    使用 FreeNAS 下載 eMule
    程序员35岁后的三条出路
    二维条码 QR Code
    笔记本CPU性能排行榜Comparison of Mobile Processors (CPU Benchmarks)
    如何在C#中播放AVI短片并使背景透明
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338444.html
Copyright © 2011-2022 走看看