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

关于递归和迭代[通俗易懂]首先明确递归和迭代的概念。递归:程序调用自身的编程技巧(将大问题化解为相同结构的小问题,从待解问题一直分解到已知答案的最小问题,在逐级返回得      到原解)    使用递归的两个阶段:    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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java安全之Commons Collections1分析前置知识

    Java安全之CommonsCollections1分析前置知识0x00前言CommonsCollections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分。ApacheC

    2021年12月12日
    46
  • spss聚类分析步骤详细解读_spss聚类分析实验报告

    spss聚类分析步骤详细解读_spss聚类分析实验报告目录快速聚类系统聚类分析二阶聚类分析快速聚类【分析】【分类】【k-均值聚类】,将变量移至变量框中,员工id移至【个案标注依据】框中【聚类数】是期望分成几组【保存】勾选【聚类成员】复选框结果解读:随机选择三个数据作为快速聚类的初始位置显示迭代次数,迭代过程可以理解为每个类别与初始位置之间的距离改变情况,当这个距离变动非常小,迭代就完成了…

    2022年10月9日
    0
  • 【有趣的实验】JAVA 遍历数组的几种方式的耗时对比「建议收藏」

    【有趣的实验】JAVA 遍历数组的几种方式的耗时对比「建议收藏」JAVA遍历数组的几种方式的耗时对比

    2022年9月19日
    0
  • 百科知识 .e,.ec文件如何打开

    百科知识 .e,.ec文件如何打开1.e是易语言源文件,你可以从以下网址下载e语言编程环境: http://www.xiazaiba.com/html/409.html  2安装之后会自动关联.e文件。  3打开一个e语言文件之后会要求打开相应的易模块文件,既".ec"文件  4下面这个程序点击运行之后打开了一个自定义的透明窗口。  5在纯黑背景下可以看到…

    2022年7月20日
    12
  • plsql 连接oracle数据库详细配置「建议收藏」

    plsql 连接oracle数据库详细配置「建议收藏」第一次用这种方式连接oracle数据库,自己百度搞了快两个小时才弄好,百度的资源也不靠谱,看了好多都不完整,搞完了报各种错误,各种连不上数据库,自己整理下资料,希望给其他的同行予以借鉴,不能保证每个人都能操作成功!毕竟有时真的得看人品了,呵呵!第一步:先安装plsql客户端,plsql客户端是必须的,我的是同事给的plsql(英文版客户端)安装很简单(下一步下一步…….)就不做说明!

    2022年9月17日
    0
  • ubuntu用 vmware 安装win10系统

    ubuntu用 vmware 安装win10系统1,下载VMwareWorkstation14Pro官网:https://www.vmware.com/cn.html需要注册一下才能下载,当然你也可以在其他网站下载。需要下载VMwareWorkstation14.0.0ProforLinux这个版本,下载结束之后的文件是:VMware-Workstation-Full-14.0.0-6661328.x86_64.bu

    2022年6月18日
    25

发表回复

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

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