void print(unsigned int num); int main() { unsigned int a = 0; scanf("%d",&a) ; print(a); return 0; } void print(unsigned int num) { if(num>9){ print(num/10); } printf("%d ",num % 10 ) ;
这段代码是实现将输入的int类型数字按位打印出来。
一个简单的递归。递归一般要满足两个条件才能使用
//1.存在限制条件 :当满足这个限制条件的时候,递归便不再继续
//2.每次递归调用之后越来越接近这个限制条件。否则会死循环,导致栈溢出 stack overflow等问题。
//比如咱们这里这个print函数,限制条件是num<=9。每次递归调用之后,num/10,直到num<=9,然后就会打印。
//让原数据更加接近限制条件的规则,就写在递归函数里面。这样才会在递归中不断接近目标。
递归貌似看起来很高大上,实则不然。
用不好容易栈溢出。而且一般会占用大量性能。
好处:
-
简洁性和可读性:递归通常能够更直观地表达问题的解决方法,使得代码更加简洁易懂。对于一些数学问题、树结构和分治算法等,递归可以提供更自然的解决方案。
-
问题分解:递归可以将问题分解成更小的子问题,使得问题的解决变得更加简单和清晰。这种问题分解的方法有助于管理复杂性,并且可以提高代码的可维护性。
-
适用性广泛:递归是一种通用的编程技术,在许多领域都有应用。它可以用于树和图的遍历、动态规划、搜索算法等多种场景。
坏处:
-
性能开销:递归调用会在栈上创建多个函数调用的栈帧,而且可能会导致栈溢出。相比之下,迭代通常只需要一个或几个变量来保存状态,因此性能开销较低。
-
复杂度分析:递归的时间和空间复杂度分析通常比较复杂。递归函数的时间复杂度可能不容易直观地确定,而且递归调用的空间复杂度也可能比较高。
-
潜在的无限循环:如果递归函数没有正确的终止条件,可能会导致无限递归调用,最终导致栈溢出。因此,编写递归函数时需要特别小心,确保有正确的终止条件。
总的来说,递归是一种非常有用的编程技术,但需要谨慎使用。在一些情况下,递归可以提供简洁、清晰的解决方案;但在另一些情况下,迭代可能更加适合,能够提供更好的性能和可控性。