关于递归和迭代[通俗易懂]

关于递归和迭代[通俗易懂]首先明确递归和迭代的概念。递归:程序调用自身的编程技巧(将大问题化解为相同结构的小问题,从待解问题一直分解到已知答案的最小问题,在逐级返回得      到原解)    使用递归的两个阶段:    1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;    2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.迭代:从已知式出发

大家好,又见面了,我是你们的朋友全栈君。

首先明确递归和迭代的概念。

递归:程序调用自身的编程技巧(将大问题化解为相同结构的小问题,从待解问题一直分解到已知答案的最小问题,在逐级返回得            到原解)

        使用递归的两个阶段:

       1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;

       2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.

迭代:从已知式出发,通过递推式,不断更新变量到解决问题。

从思想上来说,迭代是人,递归是神!迭代是人,递归是神

从实现上来说,能用迭代就不用递归(递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出)

下面以剑指offer题为例,给出几个个人感觉实现比较好的迭代。

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

分析:(递归方式分析得思路 —>迭代方式写代码)

public class Solution {
            public int JumpFloorII(int target) {
            //递归的思想快速分析问题得到思路
                if (target <= 0) {
                    return -1;
                } else if (target == 1) {
                    return 1;
                } else {
                    return 2 * JumpFloorII(target - 1);
                }
            }
        }


 f(N) = f(N-1)+
f(N-2)+
f(N-3)+…….
+f(1)+1                  (1)

        = 2^(n-1)                                                            (2)

代码1:

public class Solution {
            public int JumpFloorII(int target) {
                if(target == 0) {
                    return 0;
                }
                //该方法通过数组的形式完成1式的累加,并将每一项都保存起来。
                int[] dp = new int[target + 1];
                dp[0] = 1;
                dp[1] = 1;

                for(int i = 2;i <= target;i++) {
                    dp[i] = 0;
                    for(int j = 0;j < i;j++) {
                        dp[i] += dp[j];
                    }
                }

                return dp[target];
            }
        }

代码2 :

public class Solution {
            public int JumpFloorII(int target) {
                //该方法实现2式的累乘
                int t =1;
                if(target == 0){
                    return 0;
                }else if(target ==1){
                    return 1;
                }else {
                    for(;target-1>0;target--)
                        t = 2*t;
                }
                return t;
            }
        }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134927.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mplayer音乐播放器_potplayer 模拟5.1

    mplayer音乐播放器_potplayer 模拟5.1realplayer下载地址:https://player.helixcommunity.org/2005/downloads/下载rpm软件,然后运行它,但是此时提醒lsb>=3.1于是就要yuminstallredhat-lsb然后是这个时候提示repos源出错,网上百度一下,找到一篇文章:简单介绍如下:如何配置yum源国内的两大门户网易和搜狐都有镜像服务器了,ht

    2022年9月20日
  • PAT乙级——Java合集

    PAT乙级——Java合集简介添加链接描述  刷PAT完全是闲的时候打发时间的,感觉还蛮有意思,有空了就写几道,基本都是Java实现的,目前为止才刷了五十多道题目,等刷完继续LeetCode,这里也会持续更新的。合集PAT1001害死人不偿命的(3n+1)猜想(15分)PAT1002写出这个数(20分)(Java)PAT1003我要通过!(20分)(Java)PAT1004成绩排名(20分)(Java实现)PAT1005继续(3n+1)猜想(25分)(Java)

    2022年6月13日
  • request.getParameterValues()用法「建议收藏」

    request.getParameterValues()用法「建议收藏」本人前段也不怎么样,研究了很久终于弄明白了request.getParameterValues()的简单用法,希望以下的方案能帮你渡过难关&amp;amp;amp;amp;lt;formname=&amp;amp;amp;quot;checkform&amp;amp;amp;quot;method=&amp;amp;amp;quot;post&amp;amp;amp;quot;action=&amp;amp;amp;quot;getvalue.j

    2022年7月22日
  • Executors和ThreadPoolExecutor学习整理

    任务的执行与线程池(上) https://mp.weixin.qq.com/s/p3JZERyZXnF8jR_3KKIGJA 任务的执行与线程池(下) https://mp.weixin.qq.com/s/iUAaVXIB8rCzP_GeDhIlqAjava并发编程–Executor 框架 https://www.cnblogs.com/MOBIN/p/5436482.html线程…

    2022年2月27日
  • Python全栈工程师(集合、函数)

    Python全栈工程师(集合、函数)ParisGabrielParisGabriel感谢大家的支持你们的阅读评价就是我最好的动力我会坚持把排版内容以及偶尔的错误做的越来越好每天坚持一天一篇点个订阅吧灰常感谢当个死粉也

    2022年7月5日
  • python如何生成随机数_Python生成50个随机数

    python如何生成随机数_Python生成50个随机数1.使用random包生成随机数可以生成均匀分布,高斯分布,(包括正态分布)指数分布,(与泊松分布有区别:泊松分布表示一段时间发生多少次,而指数分布表示两次发生的时间间隔)贝塔分布,韦布尔分布的随机数由此可见,random包支持的随机分布比较有限,功能较少.例如:(1)生成[1,10]内的均匀分布随机数random.uniform(1,10)Out[29]:……

    2022年10月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号