本文是学习谭浩强递归调用章节的总结。
1.函数的递归:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
例子:有5个人做在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。依次类推,第1个人10岁。请问第5个人多大?
这是一个递归问题,求解分为两个阶段,第一个阶段是“回推”,将第n个人的年龄表示为第n-1个人年龄的函数,依次回推到底1个人的年龄。得到第1个人的年龄后,再递推回去,即第2阶段“递推”,由第1个人年龄递推第2个人的年龄,依次类推得到第n个人的年龄。一个递归问题可以分为回推和递推两个阶段。
2.用递归方法求n!。
求n!可以使用递推方法,即从1开始,乘2,再乘3....一直乘到n。递推法一个特点是从已知出发,按一定规律推出下一个实事。
求n!也可以使用递归方法。即n!等于n*(n-1)!
int f(int n){
int f;
if(n<0) cout<<"error";
else if(n==0 || n==1) f = 1;
else f = n*f(n-1);
return f;
}
3.Hanoi(汉诺)塔问题,是一个古典的数学问题,也是一个递归求解的典型例子。
题目:塔内有3个座,A,B,C,开始A座有64个盘子,依次由小到大。想把A座盘子转移到C座。要求一次只能转一个,且大在下小在上。编程打印出转移步骤。
算法思想:采用递归方法,已知n个盘子
1. 将A座n-1个盘子移到B座
2.将A座第n个盘子移动到C座
3.将B座n-1个盘子移动到C座
第一步:为解决将A座n-1个盘子移动到B座问题。需要将A座n-2个盘子移动到C座,将A座第n-1个盘子移动到B座,再将C座n-2个盘子移动到B座。后面依次类推。
第二步直接移动不需要递推。
第三步中:为解决将B座n-1个盘子移动到C座。需要将B座n-2个盘子移动到A座,将B座第n-1个盘子移动到C座,再将A座n-2个盘子移动到C座。后面依次类推。
代码:
#include <iostream>
using namespace std;
/***
算法思想:采用递归方法,已知n个盘子
1. 将A座n-1个盘子移到B座
2.将A座第n个盘子移动到C座
3.将B座n-1个盘子移动到C座
**/
void move(char x,char y){
cout<<x<<"->"<<y<<" ";
}
long long hanoi(int n,char A,char B, char C){
static long long count = 0;
count++;
if(n==1){
move(A,C);
}else{
hanoi(n-1,A,C,B);
move(A,C);
hanoi(n-1,B,A,C);
}
return count;
}
int main()
{
int n;
cin>>n;
long long count;
count = hanoi(n,'A','B','C');
cout<<endl<<"移动次数:"<<count<<endl;
return 0;
}