递归思想 Recurrences

递归其实就是自己调用自己的编程,递归作为一种算法在我们开发中经常用到,一般就是把大问题转化为与自己相似的小问题,可以少些很多代码,递归就是用有限的语句来定义对象的无线集合,但不能无线地调用本身,必须有个出口,化简位非递归状态问题解决,那么递归一般用于解决哪些问题呢?

  • 数据的定义是按 递归定义的,如Fibonacci
  • 问题解决按递归算法实现(这类问题虽然本省没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi,中国剩余定理也很类似)
  • 数据的结构形式是按递归定义的(如二叉树,广义表)

 那递归有什么缺点呢?

递归比常用的算法如for loop, while loop, do-while loop循环运行效率低,所有尽可能少用递归

 废话不多说开始举例子:

比如现在要求一个数的阶乘, 如 6! 

那现在要想求6的阶乘,我们可以变成求6乘5的阶乘, 5的阶乘等于5乘4的阶乘....依此类推,

过程: 6! = 6*5!    5!=5*4!4!= 4*3!3! =3*2!  2!=2*1 

So then 6!=6*5*4*3*2*1

下面看看代码怎么实现,我们这里用C语言:

#include<stdio.h>
int fact(int n);

int main(){
    int i;
    printf("Please print a factor number which you want to solve. ");
    scanf("%d",&i);
    printf("%d's factor solution is %d\n, i, fact(i)");
    getch();
    return 0;
    
}

int fact(int n){
    if(n<=1)
        return 1;
    else
        return n*fact(n-1); //此处函数又调用自己,这就是递归

}

我们再来看一个递归算法的实例:数制转换

(121)10=(1111001)2

下面用C语言实现:

#include<stdio.h>
#include<string.h>

void bytedance(char *s,int n,int b){
    char bit[]={"0123456789ABCDEF"};
    int len;
    if(n==0){
        strcpy(s,"");
        return;
    }

    bytedance(s,n/b,b);
    len=strlen(s);
    s[len]=bit[n%b];
    s[len+1]='\0';

}


void main(void){
    char s[80];
    int i, base, old;
    printf("please input decimal number:");
    scanf("%d",&old);
    printf("please input transfer scale:");
    scanf("%d",&base);
    bytedance(s,old,base);
    printf("%s\n",s);
    getch();
    return;    
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值