黑马程序员技术交流社区

标题: for和递归函数该如何选择? [打印本页]

作者: archdem1    时间: 2015-8-6 23:10
标题: for和递归函数该如何选择?
问题如下 求5的阶乘。
用for实现如下:
int jiecheng(int J_jiecheng){  
     if (J_jiecheng==0) return J_jiecheng;
    for (int count = J_jiecheng - 1; count != 1 ; count--) {
        J_jiecheng = count * J_jiecheng;
    }
    return J_jiecheng;
}
////////////
递归函数实现如下
int jiecheng(int J_jiecheng){
    int i = 0;
    if(J_jiecheng == 1) {
        i = 1;
    }
    else{
        i=jiecheng(J_jiecheng-1)*J_jiecheng;
    }
    return i;
}
都说递归函数耗费内存,什么时候用for好,什么时候用递归函数好呢?
作者: QQ2544    时间: 2015-8-7 19:22
同一个小功能 可以用for循环或递归分别完成,循环的时间复杂度和空间复杂度都优于用 递归实现。
递归的优越性在于条理清晰,可读性强,比较适宜于问题本身是递归性质的、用循环难于解决的问题。
在二者都不难的情况下,一般都是优先选用循环来解决问题的。
作者: archdem1    时间: 2015-8-7 22:54
QQ2544 发表于 2015-8-7 19:22
同一个小功能 可以用for循环或递归分别完成,循环的时间复杂度和空间复杂度都优于用 递归实现。
递归的优越 ...

非常感谢。
作者: 第一梦    时间: 2015-8-8 00:16
其实可以把问题扩展一下,递归和递推是对应的,而for循环只是递推的一种形式,一般情况下递归和递推是可以相互转换的,相比较而言,递归比较易于理解,建立在“假设”之上,假设某一件事已经做到了,我该怎么做。而递推是一种严密的逻辑推理,由a推b由b进而推c。至于如何选择上还不太好说。因题而异,有的类型的题目只能选用递归的方法,比如汉诺塔,用递推是很难办到的。而逻辑清晰的题目用递推会显得言简意赅。我个人比较推荐平时训练时候尽量用递归的思路来,培养递归思想,久而久之你会发现一个很神奇的事情,看一个很难的问题,虽然你不会,但是你还是能解决,因为你在假设某件事做好的情况下只需完成很简单的一步就行了!祝你好运。
作者: 墨琰    时间: 2015-8-8 21:50
我还没掌握递归,要好好学习一下
作者: archdem1    时间: 2015-8-8 23:32
第一梦 发表于 2015-8-8 00:16
其实可以把问题扩展一下,递归和递推是对应的,而for循环只是递推的一种形式,一般情况下递归和递推是可以 ...

多谢学姐指点.
作者: archdem1    时间: 2015-8-8 23:35
墨琰 发表于 2015-8-8 21:50
我还没掌握递归,要好好学习一下

一起加油喽!
作者: ljk-tt    时间: 2015-8-9 07:37
看下面评论,学习了!
作者: Xiangyz    时间: 2015-8-9 08:11
能看懂 不会用




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2