一、递归的意思是函数自己调用自身(直接方式),或者在自己函数调用的下级函数中又调用自己(间接方式)。
递归可拆分为递和归两个过程,递就是向下层传递参数,归是指当函数不再向下传递时会一层一层的返回。
二、写递归函数需考虑的要素:
a.怎样取一个变量或多个往下递归(不是绝对,但是推荐这么做,变量在传递中要有变化)。
b.怎样终止递归,要设置一个合理的终止条件(原来的规律不能成立,函数体递归前的代码不再能重复)。
c.递归过程中的暂时或中间结果怎样保存(不是每一个递归都需考虑这个情况)。
注:递归函数没有限制函数体里可以调用多少次自身,但是物理硬件决定了它还是会有一个极限,尽量不要超过26万次(UNIX)。
例:
#include <stdio.h> int sum(int n,int tmp) { //递----------------------- if(1>n)//!!! 1.这是考虑到递归函数的终止条件 { printf("\n"); return tmp; } tmp+=n;//!!! 3.累加的中间结果传递的作用。 int m=n; printf("+%d",n); int ret=sum(--n,tmp);//!!! 2.递归的过程应该伴随至少一个参数的变动 //归----------------------- printf("+%d ",m);//同样的语句放的位置不同,输出时的顺序会有变化 printf("sum(%d,%d)返回...\n",n,tmp); return ret; } int main() { int n=10; printf("累加结果:%d\n",sum(n,0)); }
三、递归思维(怎样用递归解决复杂的有规律可寻的这样的一些问题):
A.找到一个解决有规律问题方案的一个典型环节(层面), 只考虑这一个环节(层面)的代码应该如何实现.
B.在这个环节(层面)里又只需考虑:
a.参数变量如何设置,如何变化传递。
b.终止条件语句如何写, 也就是不再遵守典型规律的那些情况如何变成代码上的终止条件。
c.仔细调整一下需输出的文字信息(放在递在过程和归的过程的情况,不要出现重复打印的情况)。
结论: 递归思维本质特点是暂时忽略各个层次实现的不同细节,而只需关注固定的某一环节的较大的过程实现即可.(有规律性的,例外情况不会太多的问题,适合用递归来实现)。