C语言代码简化技巧(一)

先来看这段代码,函数功能返回非负整数n的阶乘,要求返回双精度。

double fact( int n )
{
    double s=1;
    int i;
    if(n==0)
    {
        return 1;
    }
    else
    {
        for(i=1;i<=n;i++)
        {
            s=s*i;
        }
    }
    return s;
}

结果正确,但过程似乎太长,有没有不想看的感觉,那来看另一种。

double fact( int n ){
    if(n==0)
        return 1;
    return (double)n*fact(n-1);
}

这也是正确的,但仅仅3行代码,也满足题目要求,有句话叫代码是死的,人是活的,熟悉了简化的技巧,不仅代码效率可能更高,而且提升格调啊,本文简单介绍遇到的几个写代码简化的技巧。

1. 递归思想

递归有时候能见奇效,不仅简化代码,而且节省算力,虽然当递归层数较多,栈区消耗过大,可能撑不住,但很多时候,利大于弊。上面例题简化主要的也是递归思想,多数时候可以简化到3行。

递归也有一定使用条件,比如要得到某一结果,需要多次类似过程,有些像数学中的通式,比如裴波拉切数列通式F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*),后一项和前一项或几项有关系,并且可以找到终止条件,也就是F(1)=1,F(2)=1,那么简单说就是找关系,找终止条件。

int fib( int n )//n>0
{
	if(n==1||n==2)
		return 1;//终止条件
	return fib(n-1)+fib(n-2); //通式fib(n)=fib(n-1)+fib(n-2)
}

2. 条件运算符
条件运算符 表达式1?表达式2:表达式3
一条常见面试题 #define max(a,b) a>b?a:b
当判断较为简单,表达式2和表达式3也不多的情况下,条件运算符简单明了,当然条件运算符右结合性和运算优先级要弄清楚。合理运用,不让又要写一个if else了。
例: int sign( int x );
其中x是用户传入的整型参数。符号函数的定义为:若x大于0,sign(x) = 1;若x等于0,sign(x) = 0;否则,sign(x) = −1。

int sign( int x ){
    return x>0?1:x==0?0:-1;
}

3.++和+=
++i,i++,理解前置和后置的区别,++i,先加1再用,i++,用完就加1
+=:加法赋值运算符,将运算符前面的变量加上后面的值再赋值给前面的变量。a+=b; //等价于a=a+b
±*/% 都有类似的应用
例:求m到n之和(m<=n)

int sum( int m, int n )
{
    int s=0;
    while(m<=n)
        s+=m++;
    return s;
}

4.利用数学思想
从一加到一百只能一个个加吗?当让不是,数学上有公式的啊
在这里插入图片描述
这样sum(100)=(1+100)*100/2;一步得出
例:在这里插入图片描述
仔细观察,又可以一用数学规则找到一个通式。
在这里插入图片描述
又可以利用递归思想求解了。

double fn( double x, int n )
{
    if(n==1)
        return x;
    return x*(1-fn(x,n-1));
}

猜你喜欢

转载自blog.csdn.net/qq_29011025/article/details/108157199
今日推荐