函数(续文)

        这里补充一下上次漏掉的一点,函数一定是先声明后使用的,也就是书写的先后顺序,想用这个函数,就必须让该函数在写的上面。OK,现在进行今天的每日分享。上次说完函数的基本概念还发现函数还有一些新的用法,一些新的写法分模块写法:分模块写法应该是比较常用的写法,假设说有一个东西需要很多人一起来完成,不可能说这么多人用同一台电脑,即使人同意估计电脑也不能同意。由此分模块的写法就出现了,这个大致的意思就是每个人都写出自己需要写的部分,然后最后一综合就完成了。那么该如何进行这一种写法呢?下面就由我来详细说一下,首先要创建几个独立模块,头文件,函数文件,主函数文件,一般主函数文件和头文件都是公共的,需要进行的就是不同的函数文件的书写。一般地,都会将函数声明放在(.h)头文件中,把函数实现放在(.c)函数文件中。

        下面我简单的介绍一下大致方法以加法为例,在Visual Studio2022 为编辑器中,头文件的建立,在右侧的头文件大文件夹下面新建一个add.h的文件,当作头文件。

 头文件里面主要写的是一些关于函数的声明,和定义的全局变量如图:

这些就是头文件的基本应用,接下来就是主函数文件和函数实现文件,这些我就不用多说了,一个是放主函数的,一个是放函数实现的,直接看图:

 

 

以上就是两个模块,其中上面的include“add.h”是引用自己所写的Add头文件里面的东西,可以理解成写了这个,Add.h中文件的内容也在该模块中出现,只是自己看不见而已。当然一定要记住,引用自己写的头文件的时候要用双引号而不是<>。

说完函数的一些应用,那么我将介绍最近新理解的另一个专有名词函数递归:

递归:

自我理解就是函数中的俄罗斯套娃,可以理解为是一个由限制的循环,当循环一定程度就会停止,然而这也是实现递归的条件之一:实现函数递归大致分为两个条件:第一个条件是:要有限制条件,以防止他无限的循环下去。第二个条件是:每次运行的时候,都要越来越接近限制条件。不能说我就无限接近永不相交,那样还是会造成循环效果。 这里我感觉拿题来说应该会更好的理解一下,尤其是这些限制条件那就简单举几个题来说明:

第一题:就是用递归把数字各个位置拆下来

void print(int n)
{
    if(n>9)
    {
        print(n/10);
    }
    printf("%d",n%10);
}

int main()
{
    unsigned int num=0;
    scanf("%d",&num);
    print(num);
    return 0;
}

 这题主函数中我用到了 unsigned int,把输入的数字强制转换成整型,以便后续的运行。那么现在我们来分析一下我写的函数实现部分:该题的目的是把数字按照每个数字独立的情况下打印出来。我就以123为例子,想要让其变成1,2,3的情况正常来说应该这么打印呢?如果想得到1,咱们是不是就得除100得到1(然后对1求余得到1),如何得到2呢?首先除10得到12,然后再12对10求余得到2,如何得到3呢?就是用123直接对10求余得到3。所以有了这个思路就可以开始向下写了。先想一想递归的规则,要有限制,每次运行都得接近限制条件。结合自己的分析,我们就可以知道这题的运行条件就应该是n除10,如何得出的呢?首先如果想得到1的第一步就是除10再除10.得到2的第一步就是除10,如果变成一个等比数列,就想当于,要想得到最高位的数字,我们就应该除10(的位数-1次幂),那么限制条件也显而易见就能看出来,那就是大于9,因为个位数完全可以直接打印,只有超过个位数的数字才能用到除10这个方法。等想到这里,用递归实现也就基本完成了,接下来就是打印,根据上述分析只要再最后的结果余个10就ok了,所以这个题的函数声明部分也就随之完成了。

再举一个例子:

调用DigitSum(1729),则应该返回1+7+2+9,它的和是19,输入:1729,输出:19

int DigitSum(int n)
{
	if(n>9)
		return DigitSum(n/10)+n%10;
	else
		return n;
}

 这题我就直接写函数声明部分了,这个题跟上一题基本上的思路是一模一样,各位看官可以自己思考,欢迎再下面留言评论。

再举最后一题:用递归实现n的k次方:

double jiecheng(int a, int b)

{

	if (b == 0)

	{

		return 1.0;

	}

	else if (b > 0)

	{

		return a * jiecheng(a, b - 1);

	}

	else

	{

		return 1.0 / jiecheng(a, -b);

	}

}

求阶乘,最开始我们就应该知道这有几种情况,0,正数,负数。而这三种情况也就是本题的限制条件,那么接下来我们要做的就是完成逐步向限制条件靠拢,根据不同情况我们需要进行不同的计算,如果是0的话最简单,我们直接返回1就ok了,接下来就是正数:阶乘的目的就是自身乘自身,乘几次完全就由是几次幂来决定,所以我们的入手点就是几次幂,如果求2的3次幂就相当于2*2*2,三个2相乘,意思就很明了,需要循环3次,那就是n-1-1.......一直到减为0,所以接近限制条件的方法就出来了,幂数-1,循环一次减一次。负数则是很巧妙,我们都知道负数是这么计算的本体思路跟正数一样只不过需要被1除,所以我们就需要再最开始的时候让负数变成正数就完美解决这一个问题了。

以上就是我结合不同的题来给大家做的分析,也是我自己的理解,如果对大家有所帮助,请支持一下,其实我这个也就是自己分享学习经历,主要也是想和大家探讨一下,希望大佬可以评论指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值