递归:

阶乘计算:

     /**
* 阶乘:
* 1的阶乘是1,因为1往下走一个楼梯 就是0了
* 2的阶乘是 2*1
* 3的继承是 3*2*1
* 4的继承是 4*3*2*1
* 5的阶乘是 5*4*2*1
*/
package cn.kotlin.kotlin_base06

import java.lang.Exception

/**
* 递归
*/
fun main(args: Array<String>) { while (true) { println("请输入整数,用于计算阶乘...")
var inputNumber = readLine() var number: Int = 0 try {
// inputNumber!!.toInt() !!代表一定不会为空,所以Kotlin才放心的让我.toInt() 编译通过
number = inputNumber!!.toInt() } catch (e: Exception) {
println("你输入的不是整数...")
} /**
* 阶乘:
* 1的阶乘是1,因为1往下走一个楼梯 就是0了
* 2的阶乘是 2*1
* 3的继承是 3*2*1
* 4的继承是 4*3*2*1
* 5的阶乘是 5*4*2*1
*/
var result = operation(number!!)
println("计算结果是>>>>>>>>>>>>>${result}") }
} /**
* 定义运算number的方法
* 返回计算结果
*/
fun operation(number: Int) : Int {
var result = when(number) {
1 -> 1
else -> number * operation(number - 1)
}
return result
}

执行结果:

尾递归:

累加计算:

/**
* 累加计算:
* 1的累加是1,因为1下面是0 没得 +加了
* 2的累加是 2+1
* 3的累加是 3+2+1
* 4的累加是 4+3+2+1
* 5的累加是 5+4+3+2+1
* .......
*/ 

累加计算【案例一】:

package cn.kotlin.kotlin_base06

/**
* 尾递归
*/
fun main(args: Array<String>) { /**
* 累加计算:
* 1的累加是1,因为1下面是0 没得 +加了
* 2的累加是 2+1
* 3的累加是 3+2+1
* 4的累加是 4+3+2+1
* 5的累加是 5+4+3+2+1
* .......
*/
var result = addOperation(4)
println("累加计算的结果是:${result}")
} /**
* 定义运算number的方法
* 返回计算结果
*/
fun addOperation(number: Int) : Int {
var result = when(number) {
1 -> 1
else -> number + addOperation(number - 1)
}
return result
}

执行结果:



累加计算 【案例二】,对以上【案例一】进行了 更大值得累加 来复习溢出的异常:

只把需要累加的值,100000的累加:

var result = addOperation(100000)
package cn.kotlin.kotlin_base06

/**
* 尾递归
*/
fun main(args: Array<String>) { /**
* 累加计算:
* 1的累加是1,因为1下面是0 没得 +加了
* 2的累加是 2+1
* 3的累加是 3+2+1
* 4的累加是 4+3+2+1
* 5的累加是 5+4+3+2+1
* .......
*/
var result = addOperation(100000)
println("累加计算的结果是:${result}")
} /**
* 定义运算number的方法
* 返回计算结果
*/
fun addOperation(number: Int) : Int {
var result = when(number) {
1 -> 1
else -> number + addOperation(number - 1)
}
return result
}

执行结果,溢出的异常:



以上【案例二】,引发了溢出的异常,是因为计算机运算了N多次,都计算不完 因为太多了,所以计算机直接抛出了溢出的溢出

以下【案例三】是使用Kotlin提供的 尾递归优化机制,来解决溢出的异常问题:

package cn.kotlin.kotlin_base06

/**
* 尾递归
*/
fun main(args: Array<String>) { /**
* 累加计算:
* 1的累加是1,因为1下面是0 没得 +加了
* 2的累加是 2+1
* 3的累加是 3+2+1
* 4的累加是 4+3+2+1
* 5的累加是 5+4+3+2+1
* .......
*/
var r = 0
addOperation(100000, r)
} /**
* 增加了tailrec尾递归优化机制后,它认为以下返回的不是递归操作,所以需要修改
*/
/*
tailrec fun addOperation(number: Int) : Int {
var result = when(number) {
1 -> 1
else -> number + addOperation(number - 1)
}
return result
}*/ /**
* 增加了tailrec尾递归优化机制后,它认为以下返回的不是递归操作,所以需要修改
*/
/**
* 定义运算number的方法
* 返回计算结果
*/
tailrec fun addOperation(number: Int, r: Int) : Int {
println("累加计算的结果是:${r}, 计算机在第${number}次计算....")
if (1 == number) {
return 1
} else {
return addOperation(number - 1, r + number)
}
}

执行结果:不会出现溢出的异常了:

增加了tailrec尾递归优化机制后,它会去判断是否是递归,所以不能用when来判断,否则他认为这不是递归 还是会引发溢出溢出,最好用if return 自身的方法

Android-Kotlin-递归与尾递归的更多相关文章

  1. 递归与尾递归(C语言)

    原文:递归与尾递归(C语言)[转] 作者:archimedes 出处:http://www.cnblogs.com/archimedes/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留 ...

  2. JAVA中使用递归和尾递归实现1000的阶乘的比较

    在JAVA中求阶乘首先遇到的问题就是结果溢出,不管是使用int还是long,double都无法表示1000!这么大的天文数字,这里暂且用BigInteger解决这个问题! 下面是使用递归和尾递归分别计 ...

  3. day13-Python运维开发基础(递归与尾递归)

    递归与尾递归 # ### 递归函数 """ 递归函数: 自己调用自己的函数 递:去 归:回 有去有回是递归 """ # 简单递归 def d ...

  4. 递归、尾递归和使用Stream延迟计算优化尾递归

    我们在学数据结构的时候必然会接触栈(Stack),而栈有一个重要的应用是在程序设计语言中实现递归.递归用途十分广泛,比如我们常见的阶乘,如下代码: 1234 public static int (in ...

  5. kotlin递归&尾递归优化

    递归: 对于递归最经典的应用当然就是阶乘的计算啦,所以下面用kotlin来用递归实现阶乘的计算: 编译运行: 那如果想看100的阶乘是多少呢? 应该是结果数超出了Int的表述范围,那改成Long型再试 ...

  6. 递归与尾递归(C语言)【转】

    作者:archimedes 出处:http://www.cnblogs.com/archimedes/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原 ...

  7. 接收Android数据 递归显示表格数据

    <html> <head> <title>展示</title> <script type="text/javascript" ...

  8. Android Kotlin —— 语言结合

    2017 Google I/O 大会开始就宣布,将Kotlin语言作为安卓开发的一级编程语言.        Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发.   Ko ...

  9. android sqlite 递归删除一棵子树

    背景:android studio 3.0 GreenDao 目标:在android 中,如何做到递归删除某颗子树?? ======================================== ...

  10. Android Kotlin适用小函数

    都是一些Android适用的Kotlin小函数. 1.点击空白隐藏键盘 //点击空白隐藏键盘 override fun onTouchEvent(event: MotionEvent): Boolea ...

随机推荐

  1. 20172306 《Java程序设计与数据结构》第七周学习总结

    20172306<Java程序设计>第七周学习总结 教材学习内容总结 这一章的标题是继承.主要学习了有关继承的相关知识.其中在这五节中,我学到了以下几点: 1.继承主要表达的是" ...

  2. 201621123008 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 分 ...

  3. Hotspot参数分析

    -XX:+HeapDumpOnOutOfMemoryError 让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析 -Xmx与-Xms 虚拟机堆参数 -Xoss 设置本地方法栈 ...

  4. 清晰易懂!关于PS入门的超详细笔记!

    给大家分享一篇关于PS入门的超详细笔记!原理讲解清晰明了,虽不是新版本解析,但都是新手学习PS必掌懂的一些知识点,灰常的实用,转走收藏学习! 编辑:千锋UI设计 来源:PS学堂

  5. mcu 通信数据解析

    串口发送一帧数据时,两个字节的间隔时间是多少? 波特率:发送二进制数据位的速率,习惯上用 baud 表示,即我们发送一位二进制数据的持续时间=1/baud. 如果波特率为9600,发送一个位需要的时间 ...

  6. java进行3DES加解密

    import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...

  7. Java学习笔记:数据校验

    在后台开发过程中,需要对参数进行校验. validation bean 是基于JSR-303标准开发出来的,使用注解的方式实现,是一套规范,可以实现参数的校验. Hibernate Validator ...

  8. dblink(转)

    oracle在进行跨库访问时,可以通过创建dblink实现,今天就简单的介绍下如果创建dblink,以及通过dblink完成插入.修改.删除等操作 首先了解下环境:在tnsnames.ora中配置两个 ...

  9. 非关系型数据库MongoDB

    爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来 ...

  10. 简单实现java线程池

    使用多线程以及线程池的意义无需多说,要想掌握线程池,最好的方法还是自己手动去实现. 一.实现思路      (网络盗图) 二.实现代码 1.线程池类 package com.ty.thread; im ...