递归(一)

关于递归,我已经了解过递归排序和递归解决最大子数组问题了。。。

但我发现我遇到下面的问题,还是不会。。。

算法训练 未名湖边的烦恼  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
  每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
  两个整数,表示m和n
输出格式
  一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
数据规模和约定
  m,n∈[0,18]
  问题分析

我决定好好搞清楚一下递归这种思想。

1:递归算法的思想

 递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。在C语言中的运行堆栈为他的存在提供了很好的支持,过程一般是通过函数或子过程来实现。

递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。


2:递归算法的要求

递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行 递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

3:各式各样利用递归的问题


1.兔子繁殖问题(递归实现)

一对小兔子一年后长成大兔子,一对大兔子每半年生一对小兔子,大兔子的繁殖期为4年,兔子的寿命为6年,假定第一年年初投放了一对小兔子,请编程实现,第N年年末总共有多少对兔子,N由键盘输入!

解析,这个题目比较好懂,也就是一对小兔子前一年长大,然后每半年产一对小兔子,持续4年,然后最后一年不生殖了,再过一年死亡,题目看似简单,其实要想递归起来可不是那么容易的,大家可以想一下!

代码如下:
 

#include <iostream>
using namespace std;

int calrabbit(double n)
{
	if( n <= 0)
	{
		return 0;
	}
	else if(n == 1 || n == 0.5)
	{
		return 1;
	}
	else
	{
		return calrabbit(n - 0.5) + calrabbit(n - 1);
	}
}

int main()
{
	double n;
	
	while((cin >> n) && n)
	{
		cout << calrabbit(n) << endl;
	}
	
	return 0;
}
 
分析:

年(年):      0.5   1   1.5   2   2.5   3   3.5  

兔子(对):    1     1    2    3    5    8    13

总结得到 calrabbit(n) = calrabbit(n - 0.5) + calrabbit(n - 1)


2.汉诺塔问题

理解了很久。。。

http://blog.csdn.net/william441/article/details/51069396

http://blog.csdn.net/liujian20150808/article/details/50793101


3.猴子吃桃问题

#include <iostream>
#include <stdlib.h>
using namespace std;

int fun(int n)
{
	if(n == 1)
	{
		return 1;
	}
	else
	{
		return (fun(n - 1) + 1) * 2;
	}
}
int main()
{
	int n = 10;
	
	cout << fun(n) << endl;
	
	system("PAUSE");
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值