递归的应用

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); } 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(c,算法,2010)