数据结构与算法-递归的形象化理解

fib (n) = 1  (n=1)

fib (n) = n*fib(n-1)   (n>1)

// 条件不成立,则继续调用函数并检查条件不满足则继续调用函数...直到函数返回值为1时,再一层层将返回值递归返回上来

// 我们可以用符合条件的尽量简单的实例来剖析那些复杂的算法

例如:5 * 4 * 3 * 2 * 1 = ?

算了,上面的测试数字太大太复杂了,再选个简单点的例如:3 * 2 * 1 = ?

有人说 2 * 1 = ? 更简单不过了,我们是要体现递归的特性,所以选择3 * 2 * 1 = ? 再合适不过了,废话不多,进入正题:

该递归算法源代码为:

uint32_t  fib (uint32_t  n)

{

if (1==n)

return 1;

else

return (n * fib (n-1));

}

测试源码为(由于语句嵌入层次比较深,所以我们选择最小的例子来分析,请紧随下列语句分析下去,您一定会豁然开朗!):

fib (3)

{

if (1 == 3)

return 1;

else

return (3 * fib(3-1));

}

源码展开为:

初次阅读注释请看注释1,根据后面的注释提示再看注释2:

fib (3)  /* 注释2: 最终得出 fib(3) = 6,这就是递归算法思想,它像剥洋葱表皮一样一层层深入运算一直到最嫩最好吃的一层,再将返回值一层层返回上来 */

{

if (1 == 3)

return 1;

else

return (3 * fib(3-1));  // 注释1:此处n == 传入参数3

此语句处展开:

        3 * fib (2)           // 注释2:根据fib(2) = 2, 得出 fib(3) == return (3 * fib(2)) == return (3 * 2) == return 6; 所以fib(3) = 6;

  {

       if (1==2)

         return 1;

    else

     return (2 * fib(2-1));      // 注释2:所以此处返回值为:return (2 * fib (1)) == return  (2 * 1) == return (2);由此得出fib (2) = 2

    此语句处展开:

                  2 * fib (1)             // 注释2:2 * fib (1) = 2 * 1 = 2,然后往上看到return (2 * fib (2-1));处的注释2

   {

  if (1==1)  return 1;   // 传入参数n为1,条件成立!fib (1) 将返回 1,所以请注意上面 2 * fib (1) 处的“注释2”

  else  return (1 * fib (1)); // 显然不会执行到此处

  }

  }

}

时间: 2024-11-09 17:08:55

数据结构与算法-递归的形象化理解的相关文章

数据结构与算法 —— 递归的效率问题以及递归与循环的比较

1.所谓的递归慢到底是什么原因呢? 大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的.具体是每次调用函数本身要保存的内容包括:局部变量.形参.调用函数地址.返回值.那么,如果递归调用N次,就要分配N*局部变量.N*形参.N*调用函数地址.N*返回值.从而导致了效率的低下. 2.用循环效率会比递归效率高吗? 递归与循环是两种不同的解决问题的典型思路.当然也并不是说循环效率就一定比递归高,递归和循环是两码事,递归带有栈操作,循环

数据结构与算法—递归(阶乘、斐波那契、汉诺塔)

目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单:递归通常可以简单的处理子问题,但是不一定是最好的.对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作,只关心初始条件和上下层的变化关系. 递归函数需要有临界停止点,即递归不能无限制的执行下去.通常这个点为必须经过的一个数. 递归通常能被其他方案替代(栈.数组正向求). 认识递归,递归函数通常简易但是对于初学者可能很难取理解它.拿一个递归

数据结构与算法--递归

目录 1.递归的定义 2.求一个数的阶乘:n! 3.递归的二分查找 4.分治算法 5.汉诺塔问题 5.归并排序 6.消除递归 递归和栈 7.递归的有趣应用 ①.求一个数的乘方 ②.背包问题 ③.组合:选择一支队伍 8.总结 记得小时候经常讲的一个故事:从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容是“从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容......” 什么是递归,上面的小故事就是一个明显

java数据结构与算法之递归思维(让我们更通俗地理解递归)

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53452971 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设计与实现 j

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

数据结构和算法学习六,之非递归排序

http://blog.csdn.net/feixiaoxing/article/details/6844826 在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差别是非常明显的.既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结. 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主

深入理解Mysql索引底层数据结构与算法

深入理解Mysql索引底层数据结构与算法 ----->之前很多人还问我一些关于mysql索引的底层和使用,我就特意写一篇文章跟大家一起分享一下我对mysql索引的理解,大家有更深入的理解可以下面留言. 1.索引的定义 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构 大家使用索引有没有想过这个问题?为什么索引能够帮助mysql高效获取数据?我一一给大家道来!在给大家讲之前,先更大家分享一些计算机基础知识,有助于理解 我们都知道mysql数据是已文件的形式存储

常见数据结构与算法整理总结(上)

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出. 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表.栈.队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章.Java - 集合框架完全解析 一.线性表 1.数组实现 2.链表 二.栈与队列 三.树