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

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


相关推荐

  • pycharm 滚轮调字体大小

    pycharm 滚轮调字体大小字体放大在文件 gt 设置 gt 搜索 increase increase 点击下图中添加鼠标快捷键同时按住 ctrl 鼠标向上滑动同理搜索 decrease 调整

    2026年3月18日
    2
  • 广义线性模型GLM

    广义线性模型GLM本文转自 GLM 广义线性模型 与 LR 逻辑回归 详解 原作者 爱学习的段哥哥 GLM 的内容 本应该较早之前就总结的 但一直觉得这种教科书上的基础知识不值得专门花时间 copy 到博客里来 直到某一天看到一篇不错的总结 在征求作者同意后 转载于此 本人比较懒啦 然而公式重新排版竟然花了 1 个多小时 TT 原文如下 GeorgeBoxsai Allmodelsare

    2026年3月17日
    2
  • 【转载】开源项目推荐:Qt有关的GitHub/Gitee开源项目(★精品收藏★)

    【转载】开源项目推荐:Qt有关的GitHub/Gitee开源项目(★精品收藏★)Q 想请教下 Qt5 之后推出的 qml 与之前 qt4 的 ui 开发方式 有冲突吗 我公司开发桌面程序 是两种方式兼用 还是选择其中一种 A 桌面推荐使用 QWidget 触摸式的嵌入式设备推荐使用 QML nbsp Qt 官网下载 文档 http download qt io nbsp 官方 exe 下载 https mirrors tuna tsinghua edu cn qt nbsp 清华

    2025年6月10日
    5
  • mongodb官网下载不了, MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门[通俗易懂]

    什么是MongoDB?MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB可在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB可为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储在灵活的json文档中,这意味着可以直接得到从文档到文档的数据、结构等。MongoDB是免费使用的。Mon…

    2022年4月10日
    143
  • pythoncharm怎么保存_pycharm怎么设置代码自动保存「建议收藏」

    pythoncharm怎么保存_pycharm怎么设置代码自动保存「建议收藏」pycharm一般安装完毕,就是默认是自动保存的,但是……但是….既然是程序,既然是软件,就难免出现bug。也许会有码友出现头天晚上写好的代码,打开一看,第二天白花花一片!!!泪奔有没有最简单的,就是每次编写完毕,习惯按ctrl+s手动保存。但是,提醒你务必检查一下你的设置里面,是不是码友弄好自动保存!步骤如下:菜单File->Settings…->Ap…

    2022年8月26日
    8
  • python取余数函数_python中两数相除取余数怎么运算

    python取余数函数_python中两数相除取余数怎么运算在 Python 中取余数可以通过取模运算符 或通过 divmod 函数来计算 1 取模运算符 所谓取模运算 就是计算两个数相除之后的余数 符号是 如 a b 就是计算 a 除以 b 的余数 用数学语言来描述 就是如果存在整数 n 和 m 其中 0 lt m 取模运算的两个操作数都必须是整数 可以是负整数 但是 b 不可以是 0 因为被除数不能为 0 当 a 和 b 中存在负整数时 首先计算 a b c 然后 a b 的符号与

    2026年3月19日
    2

发表回复

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

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