排序算法五:什么是递归

一、递归与迭代

递归图例:

在这里插入图片描述

1、定义

1.1、递归

就是在运行的过程中自己反复调用自己,每次旨在缩小问题规模。如果不加条件进行控制就成为死循环。

1.2、迭代

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程

2、构成递归需具备的条件

  1. 子问题须与原始问题为同样的事,且更为简单;
  2. 不能无限制地调用本身,须有个出口(判断条件),化简为非递归状况处理。

3、递归与迭代(循环)的区别与联系:

1、从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;
迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。

2、简单地说,递归是重复调用函数自身实现循环。
迭代是函数内某段代码实现循环,

3、迭代普通循环的区别是:迭代时,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。

4、递归普通循环的区别是:循环是有去无回,而递归则是有去有回(因为存在终止条件)。
在循环的次数较大的时候,迭代的效率明显高于递归。

5、任何能使用递归解决的问题都能用迭代(循环)的方法来解决,

6、迭代使用的是循环结构,递归使用的是选择结构。

4、递归与迭代(循环)的优缺点:

4.1、递归

5! = 5 x 4 x 3 x 2 x 1

n ! = n x ( n - 1 )
5 ! = 5 x 4 ! (暂存)
4 ! = 4 x 3 ! (暂存)
3 ! = 3 x 2 ! (暂存)
2 ! = 2 x 1 ! (暂存)
1 ! = 1 x 0 ! (暂存)
0 ! = 1
优:

递归能够是程序的设计结构更清晰、更简洁、更容易让人理解

缺:

大量的递归调用会耗费大量的时间和大量的内存,换言之,递归有时候会慢一些,而且占用的内存会多一些(所有的中间结果都要”暂存“)
而且每次递归都会建立函数的副本,占用大量的内存空间

4.1、迭代(循环)

优:

普通的迭代(循环)是不需要占用额外的内存的

缺:

会使程序的设计结构繁杂,

二、代码

1、递归(无终止条件)

#include <iostream>

using namespace std;

void TellStory(){		//死循环,无终止条件
    cout<<"从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事:"<<endl;
    TellStory();
}

int main()
{
    TellStory();
}

结果:

	从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事:
	从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事:
	从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事:
	从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事:
	从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事:	
	从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事:
	。。。。。(一直打印)

2、递归

#include <iostream>

using namespace std;

int JieChengDiGui(int n){
    if(n==0){
        return 1;
    }
    return n*JieChengDiGui(n-1);
}

int main()
{
    cout<<"递归:"<<endl;
    for(int i=0;i<10;i++){
        cout<<i<<"!="<<JieChengDiGui(i)<<endl;
    }
}

结果:

递归:
0 ! = 1
1 ! = 1
2 ! = 2
3 ! = 6
4 ! = 24
5 ! = 120
6 ! = 720
7 ! = 5040
8 ! = 40320
9 ! = 362880

3、迭代(循环)

#include <iostream>

using namespace std;

int JieChengDieDai(int n){
    int result = 1;
    for(int i = n;i>0;i--){
        result*=i;
    }
    return result;
}

int main()
{
    cout<<"迭代:"<<endl;
    for(int i=0;i<10;i++){
        cout<<i<<"!="<<JieChengDieDai(i)<<endl;
    }
    return 0;
}

结果:

迭代:
0 ! = 1
1 ! = 1
2 ! = 2
3 ! = 6
4 ! = 24
5 ! = 120
6 ! = 720
7 ! = 5040
8 ! = 40320
9 ! = 362880
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值