算法设计与分析之递归算法练习(上)

递归算法一:阶乘

分析

边界条件
n = 0 或 n = 1时阶乘为零
递归条件
factorial(n) = factorial(n-1) * n

代码

int factorial(int num){
    if(num == 1 || num == 0) return 1;
    return factorial(num-1)*num;
}

递归算法二:Fibonacci数列

分析

边界条件
n = 0 或 n = 1时数列项值为 1
递归条件
fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)

代码

int fibonacci(int n){
    if(n == 0|| n == 1) return 1;
    return fibonacci(n-1)+fibonacci(n-2);
}

递归算法三:汉诺塔

分析

边界条件
只有一个圆环时,只需将圆环从第一座塔移到第三座塔
递归条件
1、从第一座塔把n-1个圆环移到第二座塔,用第三座塔做辅助
2、从第一座塔把第n个圆环移到第三座塔
3、从第二座塔把n-1个圆环移到第三座塔,用第一座塔做辅助

代码

/*
    @param char 原塔位置
    @param char 终点塔位置
*/
void move(char from ,char to) {
    cout<<"Move "<<from<<"to"<<to<<endl;
}

/*
    @param int 圆环个数
    @param char 原塔位置
    @param char 辅助移动塔的位置
    @param char 终点塔位置
*/
void hanoi(int n, char first, char second,  char third) {
    if(n==1)
        move(first,third);
    else{
        //把上面n-1个圆环从first塔移动到second塔,以third塔为辅助
        hanoi(n-1,first,third,second);
        //把第n个圆环从first塔移动到third塔
        move(first,third);
        //把在second塔上的n-1个圆环移动到third塔上,以first塔为辅助
        hanoi(n-1,second,first,third);
    }
 }

递归算法四:猴子摘桃的数量

问题描述

  猴子第一天采摘了一些桃子,第二天吃了第一天的一半多一个,第三天吃了第二天的一半多一个…直到第十天就剩下一个。问:猴子第一天摘了多少桃子?

分析

边界条件
第十天剩一个桃子,即peachesNumber(10) = 1
递归条件
peachesNumber(day) = peachesNumber(day-1)/2 - 1;
转化一下
peachesNumber(day) = ( peachesNumber(day+1) + 1 ) * 2

代码

int peachesNumber(int day){
    if(day == 10) return 1;
    return (peachesNumber(day+1)+1)*2;
}

递归算法五:十进制转任意进制

分析

边界条件
十进制数除以要转换的进制数等于零时,可直接输出这个十进制数
递归条件
conversion(number/radix,radix); 即不断除以进制数进行递归知道触及边界条件

代码

/*
    @param int 十进制数
    @param int 要转换的进制
*/
void conversion(int number,int radix){
    if(number/radix == 0){
        cout<<number;return;
    }

    conversion(number/radix,radix);
    cout<<number%radix;
}

递归算法六:逆序输出一个正整数

分析

边界条件
正整数除以十等于零时直接输出
递归条件
1、输出正整数取余十
2、正整数除十递归

代码

void reverseInt(int number){
    if(number/10 == 0) {
        cout<<number<<" ";
        return;
    }

    cout<<number%10<<" ";
    reverseInt(number/10);
}

递归算法七:正序输出一个正整数

分析

边界条件
正整数除以十等于零时直接输出
递归条件
1、正整数除十递归
2、输出正整数取余十

代码

void positiveInt(int number){
    if(number/10 == 0) {
        cout<<number<<" ";
        return;
    }

    positiveInt(number/10);
    cout<<number%10<<" ";
}

本博客其他文章推荐

算法设计与分析之递归算法练习(下)

算法设计与分析之数字三角形问题

算法设计与分析之ZOJ2104- Let the Balloon Rise

算法设计与分析之优先队列及解决ZOJ1167

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值