关于递归程序设计的随笔总结

关于递归程序的几点经验总结

  • 关于递归程序的几点经验总结
    • 一、关于递归的思想
    • 二、递归函数的设计
    • 三、递归函数的注意事项

关于递归程序的几点经验总结

程序调用自身的编程技巧称为递归( recursion)。在实际应用中,递归算法由于代码极其简洁,用途广泛,但对于初学者,常常难以理解,有一句经典的话叫做“人使用迭代,神使用递归”。之所以不能理解,其原因往往是思考方式上的问题。我们必须掌握递归的思想,便于写出简洁的递归代码。

一、关于递归的思想

  递归:就是函数自身调用自身,在内存中实际上就是体现为栈的不断增长,每调用一次,就将本次调用的函数参数和下一句代码的地址存入栈中,然后跳转至调用函数的开头开始执行。如果在递归函数中没有写终止条件,就会导致函数一直调用下去,直至栈满内存溢出。
  那么在那些场合适合使用递归函数来解决问题呢?主要看需解决问题的具体情况,如果一个问题能够分解成几个较小的规模的问题,分解后的问题算法思路与问题一致,仅仅是规模不一样,那么就可以使用递归函数,这是算法中分治思想的体现。

二、递归函数的设计

编写递归函数的第一步,应当是写好函数终止条件,第二步则是进行问题分解后递归。设计任何递归函数都可以依循这个思路。
总结递归函数代码编写的步骤:

  • 1、写终止条件;
  • 2、问题分解,递归。

这样写出来的递归函数代码阅读起来思路特别清晰,和人解决问题的思考习惯基本保持一致。
示例:二叉树的先序遍历递归算法:

Status PreOrderTranverseTree(BiTree T,Statue (*visit)(ElemType e)){
	if(T){//如果是一颗空树,那么返回错误。
		visit(T->data);//如果不是空树,那么先访问树的数据
		PreOrderTranverseTree(T->lchild,visit);//然后递归调用,遍历左子树
		PreOrderTranverseTree(T->rchild,visit);//遍历右子树
		return OK;
	}else {
		return ERROR;
	}

这个递归代码和树的递归定义是紧密对应的,在编写代码时,我们可以把精力集中到单个结点的处理上(因为所有其他结点的处理办法,根据树的递归定义,其实是一样的)。对于单个结点,如果为空,则直接返回;否则,按照先序遍历的定义,先访问数据,然后依次遍历左子树和右子树。

三、递归函数的注意事项

1.终止条件非常重要。必须准确的设置好终止条件。
2.根据问题的处理办法,灵活的递归。

关于递归函数,先写这么多,以上思路是在学习数据结构中的二叉树遍历时,自己总结的学习笔记,如果不妥之处,希望大家多多批评。

你可能感兴趣的:(学习随笔_数据结构和算法)