聊聊初学者怎么理解递归

递归算法一直是编程初学者的大难题,通常拿到一道要用递归算法的题目。自己想想不明白,看别人的答案能看懂,自己写就又写不出来。每当去细想递归的时候,递归一次还好,递归多次就把自己绕进去了。
我觉得,递归的思想是一种自顶向下解决问题的算法。人脑的思维模式通常是自底向上的,因为细节掌握不清楚的话,就难以继续思考。这也是为什么多数人面对多次递归的时候,细想却想不清楚了。好不容易想清楚一次,下次再遇到又懵了。所以建立一种自顶向下的思考模式是很重要的。
要建立这种思维模式。来看看到底该怎么个自顶向下。
首先,递归算法的底,应当是清晰的。
例如n的阶乘
n==1的时候,n的阶乘等于1。
这就相当于这个问题的底,是这个问题递归到最后的终点。没有这个终点递归就会陷入死循环。
其次再看怎么自顶向下
我相信你们在高中学数列的时候,一定学过递推公式
例如 an = k*an-1 这是最简单的等比数列的递推公式
其实这也正是递归算法的核心所在
看看等比数列求前n项和需要知道什么,首项,公比
在求n的阶乘的时候我们需要知道什么
n=1的情况,和 n! = n * (n-1)!
是不是特别像?

int Nmultiplay(int n)
{
	if(n == 1)
		return 1;
	else
		rerurn n*Nmultiplay(n-1)
}

来看一个难一点的递归问题
给定一个字符串S[0,1,2…N-1],枚举它的全排列
这个问题我的思考路径:
N=1 的时候, 它的全排列有且仅有一个,即它本身,直接输出即可
N=n时, 它的全排列相当于在N=n-1时在每个n-1的排列里做不同位置的插入
很遗憾,这样的思考方式用计算机实现起来很难。它的递推公式并不简洁
来看个例子
1234
1 234

2 134

3 124

4 123

有没有发现什么,我们只需要固定n次首字符,然后把后面n-1个字符做一次全排列即可,这就是简洁的递推。需要注意的是,当结束一次循环的时候我们要把数组还原成最初的模样防止重复。

void Permutation(char* str,int from,int to)
{
	if(from == to)
	{
		for(int i = 0; i <= to; i++)
			cout << str[i]//from==to的时候,要把前面的都输出
	}
	else
	{
		for(int i = from; i <= to; i++)
		{
			swap(str[from],str[i]);
			Permutation(str,from+1,to);
			swap(str[from],str[i]);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值