递归和循环

2019-03-05  本文已影响0人  Echoooo_o
  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];
}
上一篇下一篇

猜你喜欢

热点阅读