浅谈递归、迭代、循环、遍历 以及用递归思想求解汉诺塔(hanoi)问题、斐波那契数列、累加问题

概念介绍:

循环:在满足条件的情况下,重复执行同一段代码来解决问题的方法,如while循环。

递归:通过直接或间接的反复在函数内部调用自身来解决问题的方法。

迭代:按顺序访问线性结构中的每一项,如for循环。

遍历:按照一定的规则访问非线性结构中的每一项。

 

循环我其他文章里面介绍过啦~如果大家感兴趣,可以去我的博客主页看看吧~里面详细讲了for循环以及一些经典的练习题,如打印金字塔等,在清楚for循环 循环结构体里面的循环的初始化 ,循环的继续条件和循环的步长 是如何得来的同时大家也可以更好地理解迭代思想。何乐而不为呢?今天我主要想跟大家分享一下我对 递归 的理解。

说到递归,就得先说说 分治 。何为分治呢

分治其实是一种算法思想,它主要是将一些复杂的大问题进行拆分,拆分成若干个与原问题性质类似的小问题,这些小问题相对而言比较简单,可以方便的对其进行求解,那么最终将每个小问题的解进行合并得到原问题的解的过程就是我们所说的分治思想啦。

而递归就是运用分治的思想来解决问题的。那么何为递归呢递归递归,先递后归

递归与迭代的区别:

递归就是,你爱人与你的相爱过程,你们遇见、暧昧、相恋,最终你们会拿着结婚证走进婚姻的殿堂。总而言之就是有结果。而迭代就是 你遇见渣男了,一直暧昧,走不进婚姻的殿堂没结果。看到没?递归是你爱人爱你有结果,迭代是你爱渣男没结果。正经来说就是,递归是逆向思维代码比较整洁简单有结果,而迭代是正向思维代码比较繁琐没结果。

 

问题1:累加问题:计算1+2+3+4+……+98+99+100

解题思路:假设 f(n) 是求1~n的累加,那么求解f(100)就是我们当前最大的问题。按照做题步骤,先对其进行拆分,直到拆的不能再拆的时候,对其进行求解,最后向上返回即可。图示如下(↓)一定要记住,先递再归。

代码展示:

    public static int f(int n){
        if(n==1){
            return 1;
        }
        return f(n-1)+n;
    }

 

递归的解题步骤分为那几步呢?

  • 前进段:指的就是将问题从大化小
  • 结束段:不断分解小问题直到可以方便求出小问题的解为止
  • 返回段:将小问题处理完毕之后,向上返回(有些问题是不需要返回的)

 

问题2:Hanoi问题(汉诺塔)

问题简介:汉诺塔是一个发源于印度的益智游戏,也叫河内塔。相传它源于印度神话中的大梵天创造的三个金刚柱,一根柱子上叠着上下从小到大64个黄金圆盘。大梵天命令婆罗门将这些圆盘按从小到大的顺序移动到另一根柱子上,其中大圆盘不能放在小圆盘上面。当这64个圆盘移动完的时候,世界就将毁灭。 那么好多人会问64个圆盘移动到底会花多少时间?那么古代印度距离现在已经很远,这64个圆盘还没移动完么?我们将通过递归算法来计算来看看要完成这个任务到底要多少时间?

算法讲解:最大的问题将X上的三个盘子上放到Z上,以3个为例:

最初的3个圆环都在X上面放着,目的是将X上面的3个圆环放在Z上,即X->Z ,

第一步:先将前一个从X移到Z,再将第二个从X移到Y,再将前一个从Z移到Y()

第二步:将第三个从X移到Z

第三步:先将前一个从Y移到X,再将第二个从Y移到Z,再将前一个从X移到Z()

总结:要想把3个从X移到Z,先得把前两个从X 移到 Y,再把第三个从X移到Z,最后再把前两个从Y移到Z即可。

那么64层汉诺塔对应的就是:先把前63个 X->Y,再把第64个 X->Z,最后把前63个 Y->Z即可。

 

代码展示
        

class Hanno{
    public static void main(String[] args){
        //盘子的个数 出发 中间 目的
        hanno(64,"X","Y","Z");
    }                                     
    public static void hanno(int n,String begin,String mid,String end){
        if(n==1){
            System.out.println(begin+" -> "+end);
        }else{
            hanno(n-1,begin,end,mid);
            System.out.println(begin+" -> "+end);
            hanno(n-1,mid,begin,end);
        }
    }
}

 

程序给出的就是移动的路径,经过计算要移完64个盘子大约得移动18446744073709551615次。
我们假设移动一次圆盘为一秒,那么一年为31536000秒。那么18446744073709551615/31536000约等于584942417355天,换算成年为5845.54亿年。 
目前太阳寿命约为50亿年,太阳的完整寿命大约100亿年。所以我们整个人类文明都等不到移动完整圆盘的那一天。

 

问题3:斐波那契数列  1 1 2 3 5 8 13 21 34 55 ......

代码展示:

public static int fibo(int n){
        if(n==1||n==2){
            return 1;
        }
        return fibo(n-1)+fibo(n-2);
    }

 

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值