1、fabonacci数列问题
参见http://blog.csdn.net/qinyushuang/archive/2010/12/15/6078790.aspx
2、汉诺塔问题
void hanoi(int n, char a ,char b , char c) 将n个盘子从a柱子,通过b柱子移动到c柱子,并使其从上到下盘子逐步变大 { if(n == 1) printf("将%d号盘子从%c---->%c",n,a,c); else { hanoi(n-1,a,c,b); printf("将%d号盘子从%c---->%c",n,a,c); hanoi(n-1,b,a,c); } }
T(n) = 2的n次方 - 1
3、走楼梯问题
有n级别楼梯,可以一次迈1级或者2级,问爬完此楼梯有多少种方式
count(int n) { if(n == 1) return 1; if(n == 2) return 2; //走法的种类数可以分为两种:最后一步走的一级和最后一步走的两级 //如果最后一步是走的一级,则为count(n-1)中;最后一步走的是两级,则为count(n-2) return count(n-1)+count(n-2); }
4、整数的划分问题
对于一个正整数n的划分,就是把n表示成一系列正整数的和的表达式。注意:划分与顺序无关,例如6 = 1+5和6 = 5+1被认为是一种划分,另外,这个整数本身也是一种划分。
例如:
正整数6的划分有:
6
5+1
4+2 4+1+1
3+3 3+2+1 3+1+1+1
2+2+2 2+2+1+1 2+1+1+1+1
1+1+1+1+1+1
现在的问题是对于给定的正整数n,要去编算法计算出其划分的数目P(n);
分析:
5、从n个人中选出k个人组成一个队的组合数是多少?
分析:
递推式:假设n个人中有一个人叫做A,则从n个人中选出k个人的组合数 =k个人中包括A这个人的组合数 + k个人中不包括A这个人的组合数;
结束条件: 当k == 0 或者 n == k时,组合数为1
算法:
#include<iosteam> using namespace std; void main() { int n,k; int commb(int n ,int k); cin>>n>>k; cout<<commb(n,k)<<endl; } int commb(int n,int k) { if(k > n) return 0; else if(n == k || k == 0) return 1; else return commb(n-1,k-1)+commb(n-1,k); }