山不在高,有仙则名。水不在深,有龙则灵。
——csdn时时三省
什么是递归
程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小
就是函数自己调用自己就叫做递归
示例:
这就是最简单的一种递归
换成这个就可以看一下效果 输出的话就会一直打haha 因为main函数会调用自己 括号里面的main函数也要调用 就调用到了上面的main函数 就一直这样循环 每次调用自己都会打印一次haha
但这个代码是存在问题的 会栈溢出
示例:
这个就是一个递归代码
从main函数进来 num是0 要输入值 比如输入个123 然后到print函数 就要去调用print函数 这个时候n就等于123 n大于9就进到print里面去 print又要调用print这个时候123/10就等于12 然后继续上面的过程 知道n=1 就不会进入if语句了 也就是说递归不再继续了 直接打印n%10结果1这个函数用完以后从哪里来到哪里去 然后继续打印n%10的结果=2然后继续循环直到回到main函数里面 就结束了 打印出来就是 1 2 3
自己调用自己的时候后面的代码是没有机会执行的 直到执行完代码还会一层一层返回来
递归的两个必要条件
•存在限制条件,当满足这个限制条件的时候,递归便不再继续。
•每次递归调用之后越来越接近这个限制条件。
if(n>9)这个条件如果不写的话会永远调用自己 会进入死循环 加个if就不会是死循环了
(n/10) 也很重要 如果不加这个 数字一直不会改变 就会一直循环下去
如果条件要循环很多次的话也不行 会栈溢出
栈溢出
有三个类型
栈区 会放(局部变量、函数的形参)
堆区 会放(动态内存分配的、malloc、free、calloc、realloc)
静态区 会放(全局变量、静态变量)
内存的栈区
每次用函数都会放在栈区里面 栈区空间被耗干了就会出现栈溢出
写递归代码的时候
1.不能死递归,都有跳出条件,每次递归逼近跳出条件
2.递归层次不能太深