【算法入门】递归与迭代

简介: 递归与迭代

b288ad75b8225311a858441917197d8.png

前言

作为一个算法萌新,很长一段时间总是对递归迭代的概念含糊不清,只知道用起来都是通过循环执行代码去解决一些问题,但是对于自己用的究竟算递归还是迭代傻傻分不清楚,今天就跟大家一起来好好捋一捋

迭代与递归

概念

  • 迭代

迭代时重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果

c5e9bebd311087d2eb1b4756cee5643.png

  • 递归

指在函数的定义中使用函数自身的方法

  • 根据返回值判断
  • 根据操作节点的前后位置(二叉树相关——前序,中序,后序)

f5ca71d003a88f6d722bb81206c9b96.png

这么一看两者的区分还是很明显,通过有没有调用自身,即可判断是递归还是迭代

不过有时突然想起还是容易记混,个人从字面理解的角度出发总结一下:迭代就是一代一代执行下去,很容易与for循环关联起来;递归,归就是回到原来的地方(方法),即再次调用自身

做题

回文链表

234. 回文链表 - 力扣(LeetCode)

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

回文指结构数值具有对称性

我们常见判断一个字符串是否是回文字符串,可以使用两个指针,一个最左边一个最右边,两个指针同时往中间靠,判断所指的字符是否相等

  • 迭代解法

首先用迭代的思路我们就需要去遍历链表,并且由于无法取得链表的长度,我们无法使用 for 去遍历,只能用while 通过判断链表节点是否为空完成遍历,取得数值数组后,使用双指针判断数组是否对称来推断是不是回文链表

var isPalindrome = function(head) {
    // 使用迭代获取链表对应的数组
    const list = []
    let root = head
    while (root) {
        list.push(root.val)
        root = root.next
    }
    // 使用双指针判断数组是否对称
    let left = 0
    let right = list.length - 1
    while(left < right) {
        if (list[left] != list[right]) {
            return false
        } else {
            left ++
            right --
        }
    }
    return true
};
复制代码
  • 递归解法

说实话这道题用递归着实不好想,首先要能想到,虽然无法获取链表的长度,但是从后打印链表的数值我们是可以做到的

先看下面的一段代码(从最后开始往前打印)

function reverseLog(head) {
    if (!head) {
        return
    }
    reverseLog(head.next)
    console.log(head.val)
}
复制代码

如果理解了上面的逻辑,那么这道题的递归做法就容易多了

var isPalindrome = function(head) {
    var tmp = head
    function check(head) {
        if (!head) {
            return true
        }
        const res = check(head.next) && (tmp.val == head.val)
        tmp = tmp.next
        return res
    }
    return check(head)
};
相关文章
|
7天前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)
|
12天前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
96 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
6天前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
29天前
|
机器学习/深度学习 数据采集 人工智能
机器学习算法入门与实践
【7月更文挑战第22天】机器学习算法入门与实践是一个既充满挑战又极具吸引力的过程。通过掌握基础知识、理解常见算法、注重数据预处理和模型选择、持续学习新技术和参与实践项目,你可以逐步提高自己的机器学习技能,并在实际应用中取得优异的成绩。记住,机器学习是一个不断迭代和改进的过程,保持好奇心和耐心,你将在这个领域走得更远。
|
6天前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
6天前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
1月前
|
消息中间件 存储 算法
实战算法的基础入门(2)
实战算法的基础入门
|
1月前
|
算法 大数据
实战算法的基础入门(1)
实战算法的基础入门
|
1月前
|
算法 Java
实战算法的基础入门(3)
实战算法的基础入门
|
1月前
|
算法 Python
python中算法递归错误(Recursion Errors)
【7月更文挑战第18天】
25 1

热门文章

最新文章