递归(走楼梯,阶乘)

隐身守侯 提交于 2020-03-17 03:51:21

递归我记得,我最先接触的递归的例子是汉诺塔。
但是本文现在不讲汉诺塔,嘿嘿!
我们从简单的开始
递归现象发生于递归函数,递归函数是直接或者间接的调用自己本身的这么一种函数。

举个例子 求从1连成乘到n的积,也就是求 n! 。其中就是重复的去用一个数乘一个数,接着再乘一个数,一直乘到100;我们用递归完成,

public int recursion(int i,int n)
{
	if(i==n) return n;
	return i*recursion(i+1);
}

函数recursion自己调用自己,这就是递归现象。
递归是一种很棒的算法思想,你只需要找到复杂问题中最小的重复单元或者说可能性单元,然后复杂的细节就交给计算机吧!

例子二,说有一个n级的台阶,每一步有两种走法,每次跨一步或者跨两步,问从第一阶开始,走到最后一阶有几种不同的走法。

我们知道,每一次向前都有两种走法,一阶或者两阶。问走到最后一阶有多少种走法,走到最后一阶就是说每次一步或者两步的一种组合只要能走到最后一阶,就算一种成功的组合。
每一步两种可能性,有n个台阶。问题是复杂的,但是其中最小的重复单元很明显,就是每次所面临的两种可能性,最后需要满足组合步数等于台阶数就行。

int ans = 0;//定义一个全局变量 记录符合要求的组合数
public void recursion(int i,int n)
{
	if(i>=n)//当组合步数等于或者超过台阶数 走完楼梯
	{
		if(i==n)//当组合步数等于台阶数 该组合步数有效
			ans++;
	}else
	{
		recursion(i+1,n);//在当前台阶上跨一步
		recursion(i+2,n);//在当前台阶上跨两步
	}
}

递归函数,有好的地方,也有不好的地方。
好的地方是,当你想明白了一个问题可以用递归解决,那么解决这个问题是很快的。
不好的地方是,运算过程不好跟踪,消耗空间
还有一个我们需要注意的地方就是,递归的结束,如果递归的结束处理不好或者忘了,会导致无限递归。为防止这点的出现,我们在写递归函数的时候,一定记得先确定好递归结束的条件。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!