相信学编程一年到一年半的学员一定接触了递归,这是一个非常困难的知识点,几乎可以称作“学编程时遇到的一座大山”。
但是如果你学完递归后想一想,也许会发现递归很简单
首先,递归到底是什么?
不要把递归想成特别困难的知识点,其实,你可以把递归看作一个简易版的while循环
为什么这么说呢?先上一段程序——
这是while循环写法:
#include<bits/stdc++.h> using namespace std; int main() { int n=10; while(n!=0)//运行条件 { cout<<"你好"<<endl; n--; } return 0; }
这是递归写法:
#include<bits/stdc++.h> using namespace std; void work(int n) { if(n==0) { return;//终止条件 } cout<<"你好"<<endl; work(n-1); } int main() { int n=10; work(n); return 0; }
以上程序写的是让电脑输出十次“你好”。
从两个程序中,我们可以发现:
都要有条件(while循环要的是运行条件,递归要的是终止条件)
都要有参数(示例代码中while和递归用的都是n)
当然也有不同点:
上面讲过了,while循环要的是运行条件,递归要的是终止条件
不知有没有细心的朋友发现,while循环每次都要n--,而递归只是每次在调用自己的时候将n减一。(其实这一样)
这也就是递归与while的相同点与不同点。
好了,扯了这么多,下面我们来看看递归到底是何方神圣:(因为递归多为函数,所以以下代码展示的是函数部分)
void 函数名(参数) { if(终止条件) { return;//停止 } 函数名(参数)//参数多半会减少或增加,这样起到逐层递增或逐层递减的效果。 }
这就是最简易的递归的格式。
递归,其实就是可以通过调用自己来实现循环的代码,没什么特别难理解的。
当然你可能会问:既然有循环,那为什么要学递归?
我们先不说为什么学递归,先来纠正大家对递归的一个误区
大家可能都认为递归的效率比循环高,大错特错!
递归的效率几乎和循环一样,有时会比循环还低
所以学递归并不是为了提高效率。
当然,“为什么要学递归”这个问题的答案其实出乎大部分人的意料:为了方便写程序
请注意,我没有在开玩笑。递归确实比循环好写太多。(当然特别简单的程序(就像我上面写的示范程序)还是不要用递归了,除非你闲着没事干,因为递归特别费脑子,当然程序量还是很少的)
一般情况下,递归的代码量是远远少于循环的,因为它可以自己调用自己。
还有就是,递归可以完成循环做不到的大数据类型题目,比如汉诺塔问题(见附件)
所以递归就是一种代码量非常少但是可以达到循环的效果的东西。
当然,递归也有缺陷,效率问题只是其中之一
递归非常强调规律性,这跟循环一样,但是相比较于循环,递归的代码更具有思考性,就好比解决问题和思考题。
一个是简单粗暴但是代码多的循环,一个是代码少但又需要强大的思维能力的递归,你会选哪个呢?
制作不易,给个高分,谢谢!
附件:汉诺塔问题(递归)
#include<bits/stdc++.h> using namespace std; int s=0; void hannuo(int n) { if(n>1) { hannuo(n-1); hannuo(n-1); } s++; } int main() { int n; cin>>n; hannuo(n); cout<<s; return 0; }
0.0分
4 人评分