【递归】递归函数

本文是学习谭浩强递归调用章节的总结。

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

猜你喜欢

转载自blog.csdn.net/csdn_chuxuezhe/article/details/81435624
今日推荐