菜鸟程序员


私信TA

用户名:yaoyichen

访问量:8329

签 名:

一名会编程的初中生

等  级
排  名 1100
经  验 3216
参赛次数 4
文章发表 23
年  龄 13
在职情况 学生
学  校 常州外国语学校
专  业

  自我简介:

一名会编程的初中学生(很菜)

相信学编程一年到一年半的学员一定接触了递归,这是一个非常困难的知识点,几乎可以称作“学编程时遇到的一座大山”。

但是如果你学完递归后想一想,也许会发现递归很简单

首先,递归到底是什么?

不要把递归想成特别困难的知识点,其实,你可以把递归看作一个简易版的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 人评分

  评论区

可以
2022-09-10 15:27:25
  • «
  • 1
  • »