首页 > 其他分享 >函数知识的整理

函数知识的整理

时间:2024-07-19 19:58:10浏览次数:18  
标签:return 函数 递归 int 知识 printf 整理 main

 

函数思维导图

e5630a7df2694390affe9f2521a1d24b.png

一、函数是什么

计算机的函数是一个固定的一个程序段,或称其为一个子程序。它在可以实现固定运算功能的同时,还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理;所谓出口,就是指函数的函数值,在计算机求得之后,由此带回给调用它的程序。

函数能够很好的将代码隐藏,增强程序的独立型。

二、函数的分类

函数有两大类,分别为库函数和自定义函数。

1、库函数

是C语言自己编译好的函数,为我们实现一些简单的功能,比如printf函数、scanf函数、strlen函数等,可以增强代码的可移植性,在使用库函数时要包含头文件。

推荐一个学习库函数的网站:www.cplusplus.com

2、自定义函数

在我们面对困难的问题时,库函数无法为我们解决,我们就需要自己去定义一个函数。这个就叫自定义函数。

自定义函数需要有函数名,参数,返回类型。

函数的组成:

ret_type fun_name(para1, * )
{
 statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1    函数参数

举一个例子:写一个函数可以找出两个数中的最大值

写一个函数可以找出两个整数中的最大值。
int gat_max(int x, int y) 
{
	return x > y ? x : y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int m = gat_max(a , b);
	printf("%d ", m);
	return 0;
}

三、函数的参数

1、实际参数

真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

2、形式参数

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在 函数中有效。

四、函数调用

1、传值调用

实参传递给形参是真实的值,形参和实参占用不同的内存单元,互不影响。

2、传址调用

实参传递给形参的是实参的内部地址,这样函数内部可以操作函数外部的变量。

例子:

写一个函数可以判断一个数是不是素数
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
//写一个函数判断这个数是否为素数
int is_prime_number(int n)
{
	//默认为素数
	 int k = 1;
	if (n % 2 == 0)
		return 0;
	for (int i = 3; i < sqrt(n); i+=2)
	{
		if (n % i == 0)
			return 0;
	}
	if (k)
		return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = is_prime_number(n);
	// 返回1为素数
	//返回0不是素数
	if (ret)
		printf("%d是素数\n",n);
	else printf("%d不是素数\n", n);
	return 0;
}
 is_prime_number中的形式参数n接受的只是main函数中变量n的值,两者并没有关联。 写一个函数,实现一个整形有序数组的二分查找
int find(int x, int y[],int sz)
{
	int left = 0;
	int right = sz-1;
	while (left<=right)
	{
		int k = (left + right) / 2;
		if (x > y[k])
		{
			left = k+1;
		}
		else if (x <y[k])
		{
			right = k-1;
		}
		else
			return k;
	}
	return -1;
}
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int i = 0;
	scanf("%d",&i);
	int sub=find(i, arr,10);
	if (sub == -1)
		printf("没找到");
	else
		printf("找到了,下标为:%d ", sub);
	return 0;
 }

在find函数中y【】数组接收的是main函数中arr数组的地址,两者指向同一个内存单元。

五、函数的嵌套调用和链式访问

1、嵌套调用

函数里可以嵌套别的函数进行使用。

这里写一个最简单的函数嵌套

int main()
{
    printf("hehe");
    main();
    return 0;
}

函数运行后会一直打印hehe,一会程序会挂掉,显示stack overflow栈溢出的错误,是因为每一次调用函数会在栈区开辟一段空间,main函数一直在被调用,直到把栈区沾满为止。

函数可以嵌套调用不能嵌套定义。

2、链式访问

函数可以将一个函数的返回值作为参数


#include <stdio.h>
int main()
{
    printf("%d", printf("%d", printf("%d", 43)));
    return 0;
}

printf函数的返回值是打印在屏幕上的字符或数字的个数,所以结果是4321。

六、函数的定义和声明

1、函数的声明

告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关 紧要

函数要先声明再使用

2、函数的定义

函数实现什么功能。

函数的声明一般放在头文件中,定义放在源文件中,这样可以增加程序的独立性,让程序工程化。

七、函数的递归和迭代

1、递归

程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应 用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复 杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可 描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在 于:把大事化小

递归的两个条件

1、递归存在限制条件,当满足限制条件时递归停止。

2、每次递归后无限靠近限制条件。

例子:

接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4.

//接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4.
void print(unsigned int n)
{
	if (n != 0)
	{
		print(n/10);
		printf("%u ", n % 10);
	}
}
int main()
{
	unsigned int n = 0;
	scanf("%u",&n);
	print(n);
	return 0;
}

2、迭代

当递归解决问题出现问题时,我们就会用迭代,迭代类似于循环。

列子:

求n的阶乘。(不考虑溢出) 递归的方法
//求n的阶乘。(不考虑溢出)
//递归的方法
int factorial(int n)
{
	if (n >= 2)
		return factorial(n - 1) * n;
	else
		return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = factorial(n);
	printf("%d ", ret);
	return 0;
}

迭代的方法

int factorial(int n)
{
	int counter = 1;
	for (int i = 1; i <= n; i++)
	{
		counter *= i;
	}
	return counter;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = factorial(n);
	printf("%d", ret);
	return 0;
}

当我们算1万的阶乘时递归程序会崩溃,是因为栈溢出的问题,而迭代就不会崩溃,但也计算不出来,是因为1万的阶乘数太大一个整形变量装不下。

总结:

1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。 2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。 3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开 销。  

 

标签:return,函数,递归,int,知识,printf,整理,main
From: https://blog.csdn.net/mfy12138/article/details/140449763

相关文章

  • 链表(Linked List)-Python实现-使用类和使用函数
    链表链表(LinkedList)单链表(SinglyLinkedList)节点类(NodeClass)链表类(LinkedListClass)使用链表类不用类的方法实现链表实现单链表使用函数实现链表具体讲解类的方法实现链表Node类LinkedList类不用类的方法实现链表创建节点添加节点删除节点搜索节点显示链表总......
  • ollama 0.2.7 支持函数调用了
    就在最新的ollama发布版本中对于类似openai的函数调用支持了,但是目前有一些问题,就是相关历史的model都需要修改下(添加TEMPLATE对于tools的支持),一些是一个简单的测试参考示例使用了phidata这个工具包一个参考qwen2:7b模型的修改参考了llama3-groq-tool-use这个模型的......
  • JavaScript 基础知识 Day01
    一、计算机基础知识1、计算机数据存储单位位(Bit):1bit可以保存一个0或者1(最小的存储单位)字节(Byte):1B=8b千字节(KB):1KB=1024B兆字节(MB):1MB=1024KB吉字节(GB):1GB=1024MB太字节(TB):1TB=1024GB2、关于JavaScript 它是在1952年2月由网景开......
  • C语言函数详解
    函数的概念不同于数学上的函数,在C语言中,函数(function)就是一个完成某项特定任务的一段代码,所以函数也叫子程序。函数的分类库函数为了提高写代码的效率,C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为标准库。不同的编译器厂商根据ANSI提供的标准就给出了一系列函数......
  • JAVA基础知识
    注释单行注释//多行注释/**/文档注释(JavaDoc)/**标识符和关键字关键字标识符以字母、$、_开始区分大小写可以中文或拼音(不建议)数据类型强类型语言与弱类型语言Java:强类型变量需要先定义再使用(安全性高速度慢)基本数据类型与引用数据类型基......
  • 分享Flutter 教程笔记收集整理
    01. 初学者须知02. 初识Flutter03. Flutter开发环境搭建Windows版04. 创建Flutter项目05. Flutter编写一个HelloWorld程序06. FlutterTextWidget文本组件的使用07. FlutterContainer容器组件的使用08. FlutterImage图片组件的使用09. FlutterL......
  • C++数组中lower_bound和upper_bound函数的用法
    lower_bound函数首先,对于一个升序的数组(下标从0或者1开始是无所谓的,这里假设下标从1到n),即:a[1]<=a[2]<=a[3]<=...<=a[n]这个数列是(非严格)单调递增的。lower_bound(a+1,a+n+1,x)会返回a[1..n]中所有\(\gex\)的元素里面最小的那个数的地址。也就是说,......
  • LLM 大模型学习必知必会:大模型基础知识篇
    魔搭ModelScope开源的LLM模型魔搭ModelScope欢迎各个开源的LLM模型在社区上做开源分享。目前社区上已经承载了来自各个机构贡献的不同系列的LLM模型。并且社区的开发者也在这些模型的基础上,贡献了许多创新应用,并在ModelScope的创空间上进行分享。本专题初步梳......
  • 银行业务知识全篇(财务知识、金融业务知识)
    第一部分 零售业务   1.1   储蓄业务   41.1.1   普通活期储蓄(本外币)   41.1.2   定期储蓄(本外币)   51.1.3   活期一本通   91.1.4   定期一本通   101.1.5   电话银行   111.1.6   个人支票   111.1.7......
  • 银行业务知识和专业名称解释
    序号业务分类业务名词解释说明业务类型(资产/负债/中间)关联方关联概念举例或补充例外汇管理售汇售汇是指外汇指定银行将外汇卖给外汇使用者,并根据交易行为发生之日的人民币汇率收取等值人民币的行为。中间企业、银行结汇美元现汇卖出价715.18,外币存款账户售汇100美元,需支付715.1......