c++学习日志20151207
2015-12-07 19:26
232 查看
递归
函数可以调用自己,递归的难点是观察出递推关系式,其次的由于递推对资源的利用并不高很容易超时,可以采用记忆搜索法;
下面给出我做过的两题。
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(百度百科)
Input
给出第一根柱子的圆盘个数N(N <= 20),你要做的就是找出最快将圆盘全部移到第三根柱子的方法,并将方法输出出来。
Output
如当N=3的时候,输出
对于此题就是要猜想 第n个与第n-1个的关系 (犹如数学归纳法一样 起点 ,n=k ,n=k+1) 力图将所有的情况概况下来;
下面给出我的代码
#include <iostream>
using namespace std;
int a=1,b=2,c=3;
int g(int a,int b,int c)
{
cout<<a<<c<<endl;
return 0;
}
int f(int a,int b,int c, int n)
{
if(n==1)
{
cout<<a<<c<<endl;
return 0;
}
return f(a,c,b,n-1)+g(a,b,c)+f(b,a,c,n-1);
}
int main()
{
int n;
cin>>n;
f(a,b,c,n);
return 0;
}
//貌似只有 有返回值的函数才可以递归。。。。。
下面一体 兔子问题
Description
TA家里养了一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月时就会变成成年兔子,从这个月起这对兔子每个月又生一对兔子,假如兔子都不死,问第n个月TA家里有多少只兔子?
Input
本体包含多组测试数据。
每组测试数据包含一个正整数n,表示需要计算的月数。
当n为-1时程序退出。
Output
每组测试数据的结果占一行。
每行输出当月TA家中的兔子数量。
此题要写出 数学递推式 就可以解决。
#include <iostream>
using namespace std;
int f(int n)
{
if(n==1||n==2) return 2;
if (n==3) return 4;
return f(n-1)+f(n-2);
}
int main()
{
int n;
while(cin>>n&&n!=-1)
cout<<f(n)<<endl;
return 0;
}
函数可以调用自己,递归的难点是观察出递推关系式,其次的由于递推对资源的利用并不高很容易超时,可以采用记忆搜索法;
下面给出我做过的两题。
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(百度百科)
Input
给出第一根柱子的圆盘个数N(N <= 20),你要做的就是找出最快将圆盘全部移到第三根柱子的方法,并将方法输出出来。
Output
如当N=3的时候,输出
13 12 32 13 21 23 13
每行两个数字表示将第一个数字的柱子的最上面的圆盘移动到第二个数字所表示的柱子上。
对于此题就是要猜想 第n个与第n-1个的关系 (犹如数学归纳法一样 起点 ,n=k ,n=k+1) 力图将所有的情况概况下来;
下面给出我的代码
#include <iostream>
using namespace std;
int a=1,b=2,c=3;
int g(int a,int b,int c)
{
cout<<a<<c<<endl;
return 0;
}
int f(int a,int b,int c, int n)
{
if(n==1)
{
cout<<a<<c<<endl;
return 0;
}
return f(a,c,b,n-1)+g(a,b,c)+f(b,a,c,n-1);
}
int main()
{
int n;
cin>>n;
f(a,b,c,n);
return 0;
}
//貌似只有 有返回值的函数才可以递归。。。。。
下面一体 兔子问题
Description
TA家里养了一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月时就会变成成年兔子,从这个月起这对兔子每个月又生一对兔子,假如兔子都不死,问第n个月TA家里有多少只兔子?
Input
本体包含多组测试数据。
每组测试数据包含一个正整数n,表示需要计算的月数。
当n为-1时程序退出。
Output
每组测试数据的结果占一行。
每行输出当月TA家中的兔子数量。
此题要写出 数学递推式 就可以解决。
#include <iostream>
using namespace std;
int f(int n)
{
if(n==1||n==2) return 2;
if (n==3) return 4;
return f(n-1)+f(n-2);
}
int main()
{
int n;
while(cin>>n&&n!=-1)
cout<<f(n)<<endl;
return 0;
}
相关文章推荐
- C++算法实源码分析
- 基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址
- C语言总结
- C++ STL中Map的按Key排序和按Value排序
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
- 【2015广东工业大学新生赛E】【c++函数 bitset读入二进制转十进制数】GDUT的实验室 十进制与二进制的比较
- PInvoke复习之C# C++ 字符串传递
- c++多态性
- 黑马程序员-C语言回顾-字符串
- C++11 的 5 个实用特性
- Huffman学习记录 c语言
- C++类中定义线程
- C++的头文件和实现文件分别写什么
- C/C++语言中函数参数传递的三种方式
- c++设计模式(2)--------简单工厂模式
- 黑马程序员——C语言——位运算符和变量存储原理
- knn之构造kd树和最近邻求取c++实现
- C语言编程中实现输入密码回显星号
- C语言中可变参数的宏定义
- c语言宏定义,可变参数的使用