美文网首页
递归和循环

递归和循环

作者: Echoooo_o | 来源:发表于2019-03-05 12:14 被阅读0次
    1. 求和1+3!+ 5!+7!+.....+(2n-1)!

    2. 台阶问题,n个台阶,问有多少种不同的方法跨到第n阶,
      条件:每步只能跨一个台阶或2个台阶

    首先介绍一种看起来比较炫酷实际非常垃圾,为什么垃圾呢?因为他的时间复杂度还是O(n^2)
    int fun10(int n){
        if(n==1) return 1;
        return fun(n-1)*n;
    }
    接着在main中:
    int s,n;
        s = 0;
        n = 2;
        for(int i=1;i<=2*n-1;i++){
            if(i%2!=0){
                s+=fun(i);
            }
        }
        printf("%d",s);
    既然垃圾,那么自然要寻求一种B格高一点又不失初心的求解咯
    void fun11(){
        int i = 1;
        int s = 0;
        int n = 2;
        int t = 1;
        while(i<=2*n-1){        
            t=t*i;
            if(i%2!=0) s+=t;    #青涩的我对于问题的手腕呐! //手动狗头   
            i++;
        }
        printf("%d",s);
    }
    void fun12(){
        int i = 2;
        int s = 0;
        int n = 2;
        int t = 1;
        while(i<=n){
            t=t*(2*i-1)*(2*i-2); #老师的解决
            #a左t:要求的第i项的值:{2(i-1) - 1}!;  (请忽略那个字母a我只想让字发光)
            #a右t: 前一项的值:{2*(i-2)-1 }! 与要求的左t 差  (2*i-1)*(2*i-2)倍
            #eg:i=2 1!+3! 第i=2项就是 3!(左t)= 1!(右t) * 2*3 
            s+=t;
            i++;
        }
        printf("%d",s);
    }
    
    1. 求组合数{C(n,m)}递归和循环两种算法实现
    void fun20(int a[][],int n,int m){
        #使用循环计算组合数
        /*
        C(1,1) = 1
        C(2,1) = 2 C(2,2) = 1;
        C(3,1) = 3 C(3,2) = 3; C(3,3)=1
        C(4,1) = 4 C(4,2) = 6; C(4,3)=4; C(4,4)=1
        eg:C(4,2) = C(3,1) + C(3,2) = C(3,1) + {C(2,2) + C(2,1)}
        so:C(n,m) = C(n-1,m-1) + C(n-1,m)
        */
         for(int i=1;i<=n;i++){
            a[i][1] = i;
            a[i][i] = 1;
            for(int j=2;j<i;j++){
                a[i][j] = a[i-1][j-1] + a[i-1][j];
            }
         }
         return a[n][m];
    }
    

    相关文章

      网友评论

          本文标题:递归和循环

          本文链接:https://www.haomeiwen.com/subject/qtynuqtx.html