C语言学习总结(1)-递归函数的理解

啥是递归?

即是该函数调用它本身自己,这种调用过程称为递归。

递归可以相当于循环,所以想结束递归,就必须有终止递归的条件测试部分,否则就会出现无限递归(即无限循环)。同时,这也是使用递归的难点。

案例

#include <stdio.h>
void recur(int);
int main (void)
{
	recur(1);
	return 0;
}
void recur(int n) //递归函数
{
	printf("第%d级调用\n", n); //#1
	if (n < 4)
	{
		recur(n+1); //递归
	}
	printf("第%d级返回\n", n); //#2
}
  • 输出结果:
第1级调用
第2级调用
第3级调用
第4级调用
第4级返回
第3级返回
第2级返回
第1级返回
  • 解析:
  1. 从结果可以看出,#1和#2相当于循环体,当符合测试条件(即n<4)时,#1部分循环;当测试条件为false时,#2部分循环。
  2. 在递归函数中,位于递归调用之前的语句(即#1部分),按被调函数(即recur())的顺序执行;位于递归调用之后的语句(即#2部分),按被调函数相反的顺序执行。
  3. 每级函数调用都有自己的变量,递归调用就相当于又从头开始执行函数的代码。
  4. 每次函数调用都会返回一次,并且按顺序逐级返回递归。

递归(优缺点)与循环

  • 使用循环的地方都可以使用递归
  • 缺点:
  1. 递归快速耗内存
  2. 不方便阅读和维护
  3. 效率低
  • 优点:
  1. 简洁
  2. 适合解决阶乘、涉及相反顺序的编程问题

尾递归

正好在return语句之前。
尾递归是最简单的递归形式,因为它相当于循环。

从递归函数中,可以隐约的知道所有的C函数皆平等,即是你可以调用我,我可以调用你。
PS:这是Xzhi本人第一次写博客大笑,写博客的目的是与他人分享自己学习的心得,同时是对学习的总结与记录,此文章中若存在bug,欢迎大神们指正。微笑


  • 21
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C语言是一种广泛应用于系统编程和嵌入式开发的高级编程语言函数指针是C语言中的一个重要概念,它可以指向函数,并且可以通过函数指针来调用函数。快速排序算法是一种常用的排序算法,它的核心思想是通过分治的策略将一个大问题分解为多个小问题,并通过归的方式解决这些小问题。 下面是C语言中使用函数指针实现快速排序算法的示例代码: ```c #include <stdio.h> // 交换两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 快速排序的分区函数 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选取最后一个元素作为基准 int i = (low - 1); // 定义一个指针,用于指向小于基准的元素 for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } // 快速排序函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 将数组分区,并获取分区点的位置 quickSort(arr, low, pi - 1); // 对分区点左边的子数组进行快速排序 quickSort(arr, pi + 1, high); // 对分区点右边的子数组进行快速排序 } } // 打印数组元素 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); printf("原始数组:"); printArray(arr, n); quickSort(arr, 0, n - 1); printf("排序后的数组:"); printArray(arr, n); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值