c语言函数定义格式,c语言函数调用
第一篇前言。函数的声明和定义。函数声明2。函数的定义。函数递归1。什么是递归?2.递归的两个必要条件3。练习1。练习1: 2。练习2 4。递归和迭代3。练习3 4。概要介绍本文主要介绍函数的声明和定义,以及函数递归最重要的部分。
提示:以下是本文的主要内容,以下案例可供参考。
一、函数的声明和定义1。函数声明告诉编译器什么是被调用的函数,它的参数是什么,它的返回类型是什么。但它具体存在吗,功能?
无法发表声明。函数的声明通常出现在函数使用之前。符合要求的,使用前申报。函数声明通常应该放在头文件中。功能的定义是指功能的具体实现和功能的功能实现。
测试内容
放置函数的声明。
//函数声明
int Add(int x,int y);测试内容
布局功能的实现
#包含“test.h”
//函数Add的实现
int Add(int x,int y) {
返回x y;}二。函数递归1。什么是递归?调用程序本身的编程技巧叫做递归。
作为一种算法,递归在编程语言中被广泛使用。过程或功能被直接或间接定义或解释。
打电话给你自己
一种方法,通常将一个大而复杂的问题逐层转化为一个与原问题相似的较小问题来求解,
递归策略
只需要少量的程序来描述解题过程中所需的重复计算,大大减少了程序的代码量。
考虑递归的主要方法是最小化大的东西。
2.递归的两个必要条件是有限制的。当满足这个限制时,递归将不再继续。
每次递归调用后,它越来越接近这个限制。
3.练习1。练习1:接受一个整数值(无符号)并按顺序打印它的每一位。
例如:
输入:1 2 3 4,输出1234
//函数的递归
//输入1234打印1 2 3 4
作废打印(无符号long long n) {
如果(n ^ 9)
{
打印(n/10);
}
printf(“% d ,n”);
}
//打印(1234)
//print(123) 4
//print(12) 3 4
//print(1) 2 3 4
//1 2 3 4
int main() {
无符号long long num=0;
scanf(%d ,编号);
打印(数字);//接受整数值(无符号)并按顺序打印它的每一位
返回0;
}
2.练习2编写函数不允许创建临时变量。求绳子的长度。
//查找字符串的长度
int my_strlen(char* str) {
int count=0;
while (*str!=\0)
{
数数;
str//查找下一个字符
}
返回计数;
}
//递归求解
int my_strlen(char* str) {
if (*str!=\0)
返回1 my _ strlen(str 1);
其他
返回0;
}
int main() {
char arr[]= ABC ;
int len=strlen(arr);
printf(%d\n ,len);
my _ strlen(arr);
返回0;
}
4.递归和迭代3。练习3求n的阶乘。(不考虑溢出)
递归解
//int my_strlen(char* str) {
//
//if (*str!=\0)
//返回1 my _ strlen(str 1);
//否则
//返回0;
//}
//
//int main() {
//char arr[]= ABC ;
//int len=strlen(arr);
//printf(%d\n ,len);
//my _ strlen(arr);
//返回0;
//}
4.练习4找出第n个斐波那契数列。(不考虑溢出)
//找到第n个斐波那契数
//斐波那契数列
//1 1 2 3 5 8 13 21 34 55 .
int count=0;
int Fib(int n) {
//递归
/*if (n==3)
数数;
如果(n=2)
{
返回1;
}
其他
{
返回光纤(n - 1)光纤(n-2);
}*/
//非递归
int a=1;
int b=1;
int c=1;
而(n=3)
{
c=a b;
a=b;
b=c;
n-;
}
返回c;
}
int main() {
int n=0;
scanf(%d ,n);
int sum=Fib(n);
printf(%d\n ,sum);
返回0;
}
但是我们发现了一个问题;
在使用函数fib时,如果要计算第50个斐波那契数,就要花很多时间。
用阶乘函数求10000的阶乘(不管结果是否正确),程序会崩溃。
为什么?
我们发现很多fib函数的计算其实一直在重复。
如果我们修改代码:
int count=0;
int Fib(int n) {
//递归
如果(n==3)
数数;
如果(n=2)
{
返回1;
}
其他
{
返回光纤(n - 1)光纤(n-2);
}
}
int main() {
int n=0;
scanf(%d ,n);
int sum=Fib(n);
printf(count=%d\n ,计数);
printf(sum=%d\n ,sum);
返回0;
}
光是计算第n个斐波那契数,在n=3的情况下就会被调用近千万次。
调试阶乘函数时,如果n足够大,就会报错:堆栈溢出等信息。
系统分配给程序的堆栈空间是有限的,但是如果存在无限循环,或者(无限递归),这可能会导致
打开堆栈空间最终会导致堆栈空间的耗尽,这就是所谓的堆栈溢出。
解决办法
将递归重写为非递归。使用静态对象代替非静态局部对象。在递归函数的设计中,可以用静态对象代替非静态局部对象(即堆栈对象),这样不仅可以减少每次递归调用和返回时生成和释放非静态对象的开销,还可以保存递归调用的中间状态,并且可以被所有调用层访问。很多总结题都是用递归形式解释的,只是因为它比非递归形式更清晰。然而,这些问题的迭代实现通常比递归实现更有效,尽管代码的可读性稍差。当问题太复杂而不能迭代实现时,递归实现的简单性可以补偿运行时开销。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。