递归的一些理解
递归的概念、递归的工作原理以及递归的使用发放都不难理解,而且它可以是程序变得简洁,有着其独特的作用,在《数据结构》(殷人昆版)中也多次用到。但是就是这个看起来不难,又有可能很重要的知识点,理解起来总感觉很别扭,特别是看《C程序设计》(谭浩强版)这本书中“汉诺塔”问题的时候,被调来调去的参数搞得头晕,找视频学习也没听出了所以然来,看《C++ Primer》时看到一个例题,有了一点想法,在此记录:
下面是一个求两个数最大公约数的函数:
1 // return the greatest common divisor 2 int gcd(int v1, int v2) 3 { 4 while (v2) { 5 int temp = v2; 6 v2 = v1 % v2; 7 v1 = temp; //5、6、7这三行代码是一个赋值的过程,留意与下面递归函数之间的共通性 8 } 9 return v1; 10 }
用递归求解两个数最大公约数的代码如下:
1 // recursive version greatest common divisor program 2 int rgcd(int v1, int v2) 3 { 4 if (v2 != 0) // we're done once v2 gets to zero 5 return rgcd(v2, v1%v2); // recurse, reducing v2 on each call 6 return v1; 7 } 8
这样一对比,其实观察递归代码是,从内到外理解起来更容易找到入口,先看第5行“return rgcd(v2,v1%v2);”,其意思就是当v2不等于0时,循环调用rgcd函数,并用v2初始化v1,用v1除以v2的余数初始化v2,知道v2=0的终止条件出现为止。
‖==========钟于原创 乐于分享 宁静致远 毋忆典藏==========‖