C语言:递归与迭代

本文探讨了递归函数的概念,如何通过将大问题转化为小问题并逐步解决,同时强调了递归的限制条件和内存管理。通过实例比较了递归求阶乘和迭代方法,指出迭代在效率上的优势,以及递归在复杂问题中的价值。
摘要由CSDN通过智能技术生成

递归:函数自己调用自己 
           递:递推       归:回归

思考方式: 把大问题转换为一个规模较小的原问题求解,直到子问题无法拆分
特点:使用少量的代码就可以完成复杂的任务

两个必要条件:1.递归要存在限制条件,当满足这个限制条件时,递归就会停止
                         2.每次递归调用时会越来越接近这个限制条件

举例1:求n的阶乘(0的阶乘为1;正整数n的阶乘为n!)
             阶乘公式:n!=n*(n-1)!


 #include <stdio.h>
int Fact(int n)
{
    if (n == 0)
        return 1;
    else
        return n * Fact(n - 1);
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fact(n);
    printf("%d\n", ret);
    return 0;
}

其中  条件1:n >0;n = 0 停下
         条件2:每一步过程都在不断逼近停下条件
        
举例2:顺序打印一个整数的每一位
             输入:3241  输出:3 2 4 1

#include <stdio.h>
void Print(int n)
{
	if (n > 9)
	{
		Print(n / 10);
		printf("%d", n % 10);
	}
	else
	{
		printf("%d", n % 10);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Print(n);
	return 0;
}

            这张图表示程序流程:先是一步步递推,然后在回归printf,按顺序逐个打印数字

总的来说递归就是先把问题一步步简化,然后回到每一步过程上进行解答,最终将问题解决

迭代 

    然而递归函数每一次调用都需要在本次函数调用的内存栈区申请一块内存空间来保存函数调用期间的个中局部变量,这片空间成为运行时堆栈,或者函数栈帧
    如果递归函数不返回,函数对应的栈帧空间就会被一直占用,直到递归函数不再继续时,才会逐层释放栈帧空间。
     所以递归函数层次不宜太深,太深会浪费太多栈帧空间,也可能会引起栈溢出(stack overflow)的问题。
      此时就需要用其他方法来解决问题,比如迭代(通常就是循环的方式) 

例1

#include<stdio.h>
int Fact(int n)
{
	int i = 0;
	int ret = 1;
	for (i = 1; i < n + 1; i++)
	{
		ret *= i;
	}
	return ret;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fact(n);
    printf("%d", ret);

	return 0; 
}

     这样也可以完成任务,并且效率比迭代更高

     当很多问题递归和迭代都可以解决时,递归的方式比非递归的更加清晰,但是迭代往往比递归效率更高。 然而当一个问题非常复杂,难以使用迭代的方式完成,递归便以实现的简洁性补偿它运行时的开销。

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值