Kotlin尾递归优化

2023-11-01

一、尾递归优化
1.递归的一种特殊形式
2.调用自身后无其他的操作
3.tailrec关键字提示编译器尾递归优化

二、具体的来看看一下代码说明

package net.println.kotlin.chapter5.tailrecursive

/**
 * @author:wangdong
 * @description:
 */

/**定义一个节点的list的集合*/
data class ListNode(var value: Int, var next: ListNode ?= null)

/**定义一个查找节点的方法*/
/**
 * 简单的尾递归
 * head可能为空
 * ListNode可能为空
 * 对尾递归做优化,只需要加一个关键字tailrec
 */
tailrec fun findListNode(head: ListNode ?,value: Int):ListNode ?{
    //如果传进来的head为空,返回空
    head ?: return null
    //如果找到head,就返回head
    if (head.value == value) return head
    //如果没有找到,递归继续找,在调用了自身之后,没有任何操作,直接返回
    return findListNode(head.next,value)
}

/**阶乘*/
fun factorial(n: Long):Long{
    //调用完之后,还进行了乘法,那么这个就不是尾递归了
    return n * factorial(n - 1)
}

/**定义一个树的节点*/
data class TreeNode(val value: Int){
    var left: TreeNode ?= null
    var right: TreeNode ?= null
}

/**定义一个查找的方法*/
/**
 * 传入一个根节点root
 * 传入要查找的值value
 * 返回查找到的节点
 */
fun findTreeNode(root: TreeNode ?, value: Int):TreeNode?{
    root ?: return null
    if (root.value == value) return root
    //这边调用了自己过后,又调用了一下自己,所以就不算是尾递归了
    return findTreeNode(root.left,value) ?: return findTreeNode(root.right,value)
}

fun main(args: Array<String>) {
    //递归节点数
    val MAX_NODE_COUNT = 100000
    //头部节点所在的位置
    val head = ListNode(0)
    var p = head
    //写一个for循环
    for (i in 1..MAX_NODE_COUNT){
        p.next = ListNode(i)
        p = p.next!!
    }
    //查找倒数第二个节点,找到了就把它的值打出来
    println(findListNode(head,MAX_NODE_COUNT - 2) ?.value)   //8
}

好啦,结束啦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin尾递归优化 的相关文章

  • 路由器和交换机工作原理

    路由器工作原理 路由器 三层设备 同时基于二层设备工作 当数据包进到路由器时 首先查看的是二层报头 查看的是目标MAC 目标MAC分为三种 广播 组播 单播 广播地址 解封装到三层报头 组播地址 每一个组播地址均存在自己的MAC地址 基于目

随机推荐

  • 华为OD题目: 任务总执行时长

    package com darling boot order od od10 import com sun org apache bcel internal generic IF ACMPEQ import java util 任务总执行时
  • 几种I/O编程实践

    1 传统的BIO编程 网络编程的基本模型是Client Server模型 也就是两个进程间相互通信 其中 服务端提供位置信息 绑定的IP地址和监听端口 客户端提供连接操作向服务端监听的地址发起连接请求 通过三次握手建立连接 如果连接建立成功
  • Burpsuite在Firefox中无法抓取DVWA本地数据包解决方案+导入证书

    前言 这几天重装了系统 软件也大部分重新安装 在使用bp时 遇到了不能抓取dvwa数据包的情况 解决方案 猜想 可能是浏览器自动将127 0 0 1与localhost默认选择不使用代理服务 无法修改 反正我没找到 方案 将url栏中的12
  • java计算下一个整5分钟时间点

    需求 需要获取当前时间的下一个整点时间 如13 23 获取的下一个时间为 13 25 代码 获取下一个分钟值以0或者5结尾的时间点 单位 毫秒 return public static long getNextMillisEndWithMi
  • 机器数——源码、反码、补码

    机器数 源码 反码 补码 基本定义 1 机器数是将符号 数字化 的数 是数字在计算机中的二进制表示形式 表示一个机器数 应该考虑以下三个因素 1 机器数的范围 2 机器数的符号 3 机器数中小数点的位置 我们这里只讨论二进制整数在计算机中的
  • 【Java筑基】IO流基础之常见工具流和进程通信

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 深入 全面 系统的介绍java的基础知识 文章简介 本文将深入全面介绍IO流知识 建议收藏备用 创作不易 敬请三连哦 大厂真题 大厂面试真题大全
  • Python3 入门及基础语法

    文章目录 解释型语言 解释型语言优缺点 和编译性语言的区别 Python 简介 优点 缺点 和其他语言区别 Python 入门 Python 解释器安装 Python 继承开发环境安装 第一个 Python 程序 Python 基础 注释
  • MySql的时区(serverTimezone)引发的血案

    前言 mysql8 x的jdbc升级了 增加了时区 serverTimezone 属性 并且不允许为空 血案现场 配置jdbc的URL jdbc mysql IP PORT DB characterEncoding utf8 useSSL
  • Unity-人物移动

    Unity 人物移动 人物模型 参考以下视频 如何在Unity中导入pmx格式的MMD模型 哔哩哔哩 bilibili 用的是原神模型 这里要注意导入后把人物模型的Rig换为Humanoid 人物动作 使用的Unity Chan Model
  • iOS设备分辨率和icon尺寸

    经常需要告诉设计关于iPhone的分辨和icon的需要的尺寸 有时候自己也忘记了 都是从文档 Human Interface Guidelines 中取的 mark一下 icon相关 Device or context Icon size
  • Ubuntu 22 Server安装docker

    系统版本 Ubuntu 22 Server 按照如下文章进行了安装 Ubuntu 22 安装Docker环境
  • 升级go1.18版本json-iterator coredump问题

    unexpected fault address 0x0 fatal error fault signal SIGSEGV segmentation violation code 0x80 addr 0x0 pc 0x46639f goro
  • sqlserver千万数据查询分页

    sqlserver千万数据查询分页 前言废话 sqlserver 作业调用 mysql 前言废话 人生开始感受到无力 我不是没心没肺的人 可是我心里真的不舒服 sqlserver 新建一个表 if OBJECT ID test is not
  • tensorflow SSD实战:基于深度学习的多目标识别

    SSD SSD Single Shot MultiBox Detector 是采用单个深度神经网络模型实现目标检测和识别的方法 如图2所示 该方法是综合了Faster R CNN的anchor box和YOLO单个神经网络检测思路 YOLO
  • DataX-一款稳定高效的数据同步工具-从安装、启动、配置、使用总结,看这篇让你一步到位

    前言 大数据部门现阶段ETL按同步方式分为两种 实时同步 DTS CloudCanal 离线同步 dataworks DI节点 但CloudCanal在使用中出现了部分问题 归纳总结后主要为以下几点 部分使用场景获取不到binlog点位 停
  • python爬虫实战-如何批量爬取唯品会商品信息>>>

    第一步 打开唯品会网站 https www vip com 然后随意搜索一种商品 比如 键盘 搜索之后下拉发现页面URL没有发生改变 但是商品信息在不断加载 那么这就是动态Ajax技术 遇到这种情况 第一反应就是找接口 第二步 打开开发者工
  • 盘点2022初级Java笔试题,选择题,简答题(右滑查看答案)

    2022Java笔试题总结 一 选择题 可能不止一个选项 二 解答题 结束语 个人主页 编程ID 个人简介 大家好 我是编程ID 一个想要与大家共同进步的程序员儿 欢迎大家 这里是CSDN 我总结知识的地方 欢迎来到我的博客 望能帮到各位想
  • 负载均衡分类及选择(lvs/nginx/haproxy/keepalived)

    lvs官网 http www linuxvirtualserver org haproxy官网 https www haproxy org https www haproxy com nginx官网 https nginx org keep
  • 兼容性测试的测试点

    兼容性测试的测试点 1 测试软件是否能在不同的操作系统平台上兼容 或测试软件是否能在同一操作平台的不同版本上兼容 2 软件本身能否向前或向后兼容 主要指的是能否兼容不同版本的数据 3 测试软件能否与其他相关的软件兼容 例如杀毒软件 文字处理
  • Kotlin尾递归优化

    一 尾递归优化 1 递归的一种特殊形式 2 调用自身后无其他的操作 3 tailrec关键字提示编译器尾递归优化 二 具体的来看看一下代码说明 package net println kotlin chapter5 tailrecursiv