递归:

阶乘计算:

     /**
* 阶乘:
* 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. Trapping Rain Water LT42

    The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of ...

  2. 秒懂 this

    一:全局执行 console.log(this); // Window 可以看出在全局作用域中 this 指向当前的全局对象 Window. 二:函数中执行 1.非严格模式中 function fun ...

  3. barcode(index)

    在很多情况下,我们需要把多个样本混合在一起,在同一个通道(lane)里完成测序.像转录组测序.miRNA测序.lncRNA测序.ChIP测序等等,通常每个样本所需要的数据量都比较少,远少于HiSeq一 ...

  4. [ASP.NET]使用Layer简介

    layer是一款近年来备受青睐的web弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验. 在与同类组件的比较中,layer总是能轻易获胜.她尽可能 ...

  5. /bin/sh^M:bad interpreter:

    /bin/sh^M:bad interpreter: No such file or directory 这个错误发生在你在windows下编写文件上传到linux服务器去运行的时候. 错误原因:wi ...

  6. NOIP2016原题终结测试(2017081801)

    NOIP2016还有几道原题没有写掉,今天就一并布置掉. 答案的问题,有部分会先放到NOIP题解中,是单独发布的. 最后会汇总放在答案中,各位不要急. 还有,后期会有原创题测试,这个不急,反正11月才 ...

  7. syslog系统日志、Windows事件日志监控

  8. 42.OC中instancetype与id的区别

    区别: 在ARC(Auto Reference Count)环境下: instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型,运行时检查类型 在MRC(Manual Re ...

  9. 2018.11.06 NOIP训练 最大获利(profit)(01分数规划+最大权闭合子图)

    传送门 好题啊. ∑i<jpi,jK∗(200−K)>X\frac{\sum_{i<j}p_{i,j}}{K*(200-K)}>XK∗(200−K)∑i<j​pi,j​​ ...

  10. Java基础-时间类

    关于java中六个时间类的使用和区别 java.util.Date java.sql.Date ,java.sql.Time , java.sql.Timestamp java.text.Simple ...