关于递归,我已经了解过递归排序和递归解决最大子数组问题了。。。
但我发现我遇到下面的问题,还是不会。。。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
问题分析
我决定好好搞清楚一下递归这种思想。
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;
}