递归的一些理解

递归的概念、递归的工作原理以及递归的使用发放都不难理解,而且它可以是程序变得简洁,有着其独特的作用,在《数据结构》(殷人昆版)中也多次用到。但是就是这个看起来不难,又有可能很重要的知识点,理解起来总感觉很别扭,特别是看《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的终止条件出现为止。

原文地址:https://www.cnblogs.com/tingshuixuan2012/p/2991939.html