C函数
- 关键字
return
- 运算符---
*
、&
- 如何把指针变量用作函数参数
- 函数类型
- 递归
return的使用
示例代码:
/**
* @Author: Lucifer
* @Date: 5/3/2023, 4:07:12 PM
* @LastEditors: Lucifer
* @LastEditTime: 5/3/2023, 4:07:12 PM
* Description: 两数比较大小,返回更小的.使用return
* Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
*/
# include<stdio.h>
int imin(int, int);
int main(void)
{
int numberOne, numberTwo;
printf("输入两个整数,或者按q退出: \n");
while (scanf("%d %d", &numberOne, &numberTwo) == 2)
{
printf("%d 和 %d 当中更小的是 %d. \n", numberOne, numberTwo, imin(numberOne, numberTwo));
printf("输入两个整数,或者按q退出: \n");
}
printf("结束!");
return 0;
}
/** 比较两数大小,返回最小的 */
int imin(int n, int m)
{
int min;
if (n < m)
min = n;
else
min = m;
return min;
}
函数原型
使用函数原型的目的:
为了让编译器第一次调用该函数的时候就知道如何使用它
示例代码:
/**
* @Author: Lucifer
* @Date: 5/3/2023, 4:14:40 PM
* @LastEditors: Lucifer
* @LastEditTime: 5/3/2023, 4:14:40 PM
* Description: 函数原型的使用
* Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
*/
# include<stdio.h>
int imax(int a, int b); // 不可以在声明中既是函数定义也是函数原型,会导致重定义错误
int main(void)
{
int n, m, z;
printf("输入两个数(或按q退出):\n");
while (scanf("%d %d", &n, &m) == 2)
{
z = imax(n, m);
printf("%d 和 %d 中更大的是 %d.\n", n, m, z);
printf("输入两个数(或按q退出):\n");
}
printf("结束");
return 0;
}
int imax(int a, int b)
{
return a > b ? a : b;
}
递归
什么是递归?
函数自己调用自己的过程叫做递归
难点:
结束递归
递归示例:
/**
* @Author: Lucifer
* @Date: 5/3/2023, 4:33:07 PM
* @LastEditors: Lucifer
* @LastEditTime: 5/3/2023, 4:33:07 PM
* Description: 递归的示例和递归的使用
* Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
*/
# include<stdio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
getchar();
return 0;
}
void up_and_down(int n)
{
printf("数 %d: n 在计算机中的存储地址是 %p \n", n, &n); // &取址符号
if (n < 4)
up_and_down(n + 1);
printf("数 %d: n 在计算机中的存储地址是 %p \n", n, &n);
}
难点:
递归次数(递归结束条件)
分析:
上述代码当中一共有八段输出,up_and_down
函数被调用了四次,最后一次 调用结束以后打印了四次.函数开始返回,继续打印四次.所以一共输出八段
尾递归
尾递归计算阶乘示例代码:
/**
* @Author: Lucifer
* @Date: 5/3/2023, 5:00:01 PM
* @LastEditors: Lucifer
* @LastEditTime: 5/3/2023, 5:00:01 PM
* Description: 分别使用循环和递归计算阶乘(主要介绍尾递归)
* Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
*/
# include<stdio.h>
long fact(int);
long rfact(int);
int main(void)
{
int num;
printf("这是一个计算阶乘的程序.\n");
printf("输入0 - 12 内的整数, 按q退出.\n");
while (scanf("%d", &num) == 1)
{
if (num < 0 || num > 12)
{
printf("重新输入!\n");
continue;
}
else
{
printf("循环: %d 的阶乘是 %ld.\n", num, fact((long) num));
printf("递归: %d 的阶乘是 %ld.\n", num, rfact((long) num));
}
printf("输入0 - 12 内的整数, 按q退出.\n");
}
printf("结束!");
return 0;
}
long fact(int n)
{
long ans;
for (ans = 1; n > 1; n--)
ans *= n;
return ans;
}
long rfact(int n)
{
long ans;
if (n > 0)
ans = n * rfact(n - 1);
else
ans = 1;
return ans;
}
递归和倒序计算
一个以二进制形式表示输入数的算法:
思路:
- 十进制转二进制中,十进制奇数的末尾是
1
,偶数的末尾是0
---> 所以通过%2
来确定末尾值 - 如何十进制数的下一位二进制数(十进制数
/2
结果在%2
) - 结束条件,
/2
结果<2
示例代码:
/**
* @Author: Lucifer
* @Date: 5/3/2023, 5:33:11 PM
* @LastEditors: Lucifer
* @LastEditTime: 5/3/2023, 5:33:11 PM
* Description: 进制转换问题,主要是解决十进制转二进制
* Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
*/
# include<stdio.h>
void to_binary(unsigned long);
int main(void)
{
unsigned long number;
printf("输入一个正整数,q退出!.\n");
while (scanf("%lu", &number) == 1)
{
printf("该数的二进制数是:\n");
to_binary(number);
putchar('\n');
printf("输入一个正整数,q退出!.\n");
}
printf("Done!");
return 0;
}
// 递归
void to_binary(unsigned long n)
{
int r;
r = n % 2; // 记录余数
if (n >= 2)
to_binary(n / 2);
putchar(r == 0 ? '0': '1');
return;
}
双递归
示例代码:
/**
* @Author: Lucifer
* @Date: 5/3/2023, 5:40:35 PM
* @LastEditors: Lucifer
* @LastEditTime: 5/3/2023, 5:40:35 PM
* Description: 通过斐波那契数列展示双递归使用
* Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
*/
# include<stdio.h>
unsigned long Fibonacci(unsigned n);
int main(void)
{
Fibonacci(10);
return 0;
}
unsigned long Fibonacci(unsigned n)
{
if (n > 2)
return Fibonacci(n - 1) + Fibonacci(n - 2);
else
return 1;
}
递归的缺点:
对于计算机内存资源的消耗是巨大的
头文件的使用
- 把函数原型放在头文件中
- 把函数定义放在第二个文件中
这样就可以不需要每次都声明函数原型了
示例程序:
标签:return,函数,递归,int,printf,long,2023 From: https://www.cnblogs.com/JunkingBoy/p/17371697.html