迭代与递归深入解析

             对于程序开发中要执行相同的运算(例:阶乘运算),我们应该选择哪一种函数调用呢?那迭代与递归调用的相同点与不同点又是什么呢?下面我们就来深入分析其中执行的机制(从性能,变量申请,内存,运算时间方面考虑)。

迭代与递归比较:

相同点:1.他们都有运算的出口点,也就是说迭代和递归都有自己的终止条件,否则会引发无限循环迭代与无限递归。

异同点:1.迭代是不断的对变量A调用变量B(即:所有操作在同一个变量结果中完成,无需额外的变量),而递归则是不断的对自身函数进行调用(即,不断的自自调用自身这个函数,不断的产生函数副本(其中包含重新申请的变量(即函数形参)和返回调用函数的地址。他们做为一个整体数据项。即:活动记录)来压入函数调用堆栈中,这个时候会产生性能方面问题(如果自身调用足够多次),内存消耗相应巨大(如果程序对性能要求高的话) ,并且占用相当多的处理器运算时间。

代码示例:

#include <iostream>
#include <iomanip>//流格式定义头文件
using namespace std;

int factorial(int x){//采用迭代方式循环
    int result = 1;//所有计算都在同一个变量中完成,即对变量A不断的调用变量B
    for(int i = x; i >= 1; i--){//0和1的阶乘都是1
        result *= i;
    }
    return result;//返回相应的结果
}

int factorialTwo(int x){//采用递归方式不断调用自身
    int result = 1;
    if(x <= 1){
        return 1;
    }else{
        return x * factorialTwo(x - 1);//不断的调用自身函数,会产生巨大的函数复本
    }
}

int main(){
    cout<<"迭代测试:"<<endl;
    for(int count = 0; count < 5; count++){
        cout<<setw(2)<<count<<"! = "<<factorial(count)<<endl;
    }
    cout<<"递归测试:"<<endl;
    for(int count = 0; count < 5; count++){
        cout<<setw(2)<<count<<"! = "<<factorialTwo(count)<<endl;
    }
}

 

执行执行结果:

迭代测试:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
递归测试:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24

 

总结:

1.对于开发中应尽量避免用递归,能用递归的方式都可以用迭代来解决。

2.当用递归方式比迭代方式更能说明问题,并且程序维护方面更加友好的时候,才是递归的用武之地。

3.高性能:迭代就是首选项。


转自个人技术网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值