什么是递归
一、递归与迭代
递归图例:
1、定义
1.1、递归
就是在运行的过程中自己反复调用自己,每次旨在缩小问题规模。如果不加条件进行控制就成为死循环。
1.2、迭代
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程
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