摘要:
问题:题目:在二维数组中使用2来代表墙壁,1来代表老鼠的行径,试写出代码求得老鼠由入口走到出口的路线(一条便可)。输入:输入一个二维数组,2代表墙壁,0代表空(表示可走),再输入起点和终点坐标,输出整个数组,2代表墙壁,将可行路线(一条)中的0换成1。还可以换一种 描述:有一个迷宫,在迷宫的某个出口放着一块奶酪。将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪。请找出它的行走路径。解法:这个问题可以用递归的方法去求解。 绿色箭头指向的是迷宫的入口,将小老鼠由此放入,红色箭头的位置就是奶酪的所在地,小老鼠必须穿过迷宫从红色箭头标示的地方走出去。我们用一个二维数组来表示迷宫,用2表示迷宫的墙 阅读全文
随笔分类 - 算法---递归
面试题之括号匹配分析( 出栈序列是否合法,给定一个入栈序列,求所有可能的出栈序列等等)
2013-10-04 21:52 by youxin, 2748 阅读, 收藏, 编辑
摘要:
题目:括号匹配分析给定字符串,输出括号是否匹配,例如,"()" yes;")(" no;"(abcd(e)" no;"(a)(b)" yes。要求必须用递归写,整个实现不可以出现一个循环语句。分析这个题目很多同学都见过了,如果没有后面的条件,会张口就说就来用栈来实现,时间复杂度O(n),空间复杂度O... 阅读全文
面试题:递归颠倒栈 与栈排序
2013-09-01 22:01 by youxin, 2205 阅读, 收藏, 编辑
摘要:
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过... 阅读全文
[转载] 递归问题整理
2013-08-27 19:01 by youxin, 603 阅读, 收藏, 编辑
摘要:
不敢说是总结,就是把自己看到的一些递归相关题目整理一下,并按照自己的理解归下类~单路递归(一个递归过程中只有一个递归入口)多路递归(一个递归过程中有多个入口)间接递归(函数可通过其他函数间接调用自己)迭代递归(每次递归调用都包含一次循环递归)下面一一整理,注意许多题目都有更优解法,如DP,但是暂不讨论。先说说解递归的一般思路吧,把原问题分解为更小的子问题,再从子问题里慢慢寻找原问题的解。实际上递归是一种思路,解题时首先列出递归表达式,然后用程序语言的方式把他表现出来。往往递归都可转化为循环或者模拟调用栈来实现,但是递归表达更利于理解。一,单路递归(递归链)1,求n的阶乘(经典实例)intfac 阅读全文
递归分类(类型)
2013-08-27 05:05 by youxin, 1618 阅读, 收藏, 编辑
摘要:
Types of RecursionThere are many ways to categorize arecursivefunction. Listed below are some of the most common.1.Linear Recursive 线性递归Alinear recursivefunction is a function that only makes a single call to itself each time the function runs (as opposed to one that would call itself multiple times 阅读全文
递归实现回文判断
2013-08-22 15:35 by youxin, 5187 阅读, 收藏, 编辑
摘要:
首先我们要考虑使用递归的2个条件,原问题是否可以分解为形式相同但规模更小的问题,还有就是如果存在这样的分解,那么这种分解是否存在一种简单情境?先来看第一点,是否存在一种符合条件的分解。容易发现,如果一个字符串是回文,那么在它的内部一定存在着更小的回文。 比如level里面的eve也是回文。 而且,我们注意到,一个回文的第一个字符和最后一个字符一定是相同的。所以我们很自然的有这样的方法:先判断给定字符串的首尾字符是否相等,若相等,则判断去掉首尾字符后的字符串是否为回文,若不相等,则该字符串不是回文。 注意,我们已经成功地把问题的规模缩小了,去掉首尾字符的字符串当然比原字符串小。接着再来看第二点, 阅读全文
一个i++和++i导致的严重的错误
2013-08-20 21:11 by youxin, 331 阅读, 收藏, 编辑
摘要:
当我曾经在写一个strlen的实现时,用递归写出了如下的代码:int strlen(const char *s){ if(*s=='\0') return 0; else return strlen(s++)+1;}程序一运行就崩溃了,why!都是s++惹的或!原因在于s++,s指针还没有+1时就去调用strlen,如此循环,s指向的始终是首字符,形成了无穷递归,改成strlen(++s)就好了。 阅读全文
汉诺塔的非递归算法
2013-08-18 19:03 by youxin, 738 阅读, 收藏, 编辑
摘要:
http://ahauhs.blog.163.com/blog/static/298541892008819426616/http://www.cnblogs.com/gyb333/archive/2012/12/24/Hanoi.htmlhttp://hi.baidu.com/darren_guo/item/0d6481b044fc5fe14fc7fdd6 阅读全文
递归斐波那契数列时间复杂度
2013-08-17 22:56 by youxin, 5502 阅读, 收藏, 编辑
摘要:
以前看数据结构与算法分析(C语言描述),作者在讲述算法分析时提到递归计算斐波那契数列,Fib(intN){if(N=Fib(N);而Fib(N)=(3/2)^(N)这个地方作者处理得有些不太彻底,不是吗?翻来覆去没把Fib(N)准确求出,今天我翻看另一本资料,更模糊了,它求得2^(N/2)<T(N)<2^(N)就完事了。不过今天我开窍了,T(N)=T(N-1)+T(N-2);这是什么?也许你会说这是一个递推式,但它的学名是二阶齐次差分方程,我今天猛然看出这一点:)!什么是差分方程?以下资料全部来自IntroductiontoNumericalAnalysis,secondEditi 阅读全文
排列问题的递归算法和非递归算法
2013-08-14 17:45 by youxin, 909 阅读, 收藏, 编辑
摘要:
参考:算法设计与分析 郑宗汉原理:简单地说:第一个数与后面的依次交换!E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b)然后a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次递归进行排列生成的代码:#includeusing namespace std;/*数组a[],元素个数n,后面需要排列的元素个数k*/void perm(int a[],int k,int n){ int i; if(k==1) { for(i=0;i v... 阅读全文
递归 解剖
2012-07-22 17:20 by youxin, 450 阅读, 收藏, 编辑
摘要:
调用函数时会发生什么情况? 每个函数(包括main)的状态是由函数中所有自动变量的内容,函数参数的值,表明在调用函数的何处重新开始的返回地址决定的。包含所有这些信息的数据区称为活动记录(activation record)或者栈结构(stack frame)。他是在运行时栈(run-time stack)上分配空间的。只有函数正在执行,他的活动记录就一直存在。这个记录是函数的私有信息池,它存储了程序正确执行并正确返回到调用它的函数所需的所有信息。活动记录的寿命一般很短,因为他们在函数开始执行时得到动态分配的空间,在函数退出时就释放其空间,只有main()的活动记录的寿命比其他活动记录常。活.. 阅读全文
horner's rule霍纳法则及综合除法
2012-03-15 23:15 by youxin, 1257 阅读, 收藏, 编辑
摘要:
首先参考 horner's rule:http://en.wikipedia.org/wiki/Horner_scheme在synthetic divisions :http://en.wikipedia.org/wiki/Ruffini%27s_rulepn(x)=anx^n+a(n-1)*X^(n-1)+.....+a1*x+a0;归纳:1基础部:n=0; 有p0=an;2,归纳不:对任意的k,1using namespace std;float horner(int a[],float x,int n){ float result=0; for(int i=n;i>=0;i 阅读全文
基于递归的整数幂的计算
2012-03-15 21:26 by youxin, 729 阅读, 收藏, 编辑
摘要:
首先来看一个简单的计算n阶乘的例子:int factorial(int n){ if(n==0) return 1; else return n*factorial(n-1);}程序虽然简单,确反应了递归的基本思想。计算整数幂的的函数,如求a的n次幂。要分n为odd和even1.odd a^n=a^(n/2) * a^(n/2)*a;2.even a^n=a^(n/2)*a^(n/2)基于这点源码如下:#includeint power(int a,int n){ if(a%2==0) { if(n==1) ... 阅读全文