递归:

阶乘计算:

     /**
* 阶乘:
* 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. 【已处理完】Centos 6.5版本,df -h出来的容量与du -sh的容量不对应是怎么会事呢?

    问题如题,df -h 出来的容量与du -sh 查看的容量信息不一样,是那里出了问题了吗? 下面分别是du -sh *与df -h出来的结果 [root@mail /]# du -sh * 6.2M ...

  2. python 截取某一天的日志,简单操作

    #!/usr/bin/python #Filename: Segmentation_log.py import re,sys def openfile(*args): try: f=open(args ...

  3. Eloquent Attach/Detach/Sync Fires Any Event

    eloquent-attach-detach-sync-fires-any-event I have a laravel project, and I need to make some calcul ...

  4. [AI]AI章2 框架比较

    深度学习框架比较 神经网络一般包括:训练,测试两大阶段.训练:就是把训练数据(原料)和神经网络模型:如AlexNet.RNN等“倒进” 神经网络训练框架例如cafffe等然后用 CPU或GPU(真火) ...

  5. android 使用webview 加载网页

    1. <WebView android:id="@+id/webView" android:layout_width="fill_parent" andr ...

  6. 利用PHP脚本辅助MySQL数据库管理5-检查异常数据

    <?php $dbi = new DbMysql; $dbi->dbh = 'mysql://root:mysql@127.0.0.1/coffeetest'; $map = array( ...

  7. 【转】C#异步的世界【下】

    [转]C#异步的世界[下] 接上篇:<C#异步的世界[上]> 上篇主要分析了async\await之前的一些异步模式,今天说异步的主要是指C#5的async\await异步.在此为了方便的 ...

  8. SpringMVC 学习 八 SSM环境搭建(一) web.xml配置

    第一步:导入jar包 注意包的兼容性,以后采用maven会好很多 第二步:配置web.xml 在web.xml中,主要的配置内容有以下几点 (1)spring容器配置文件的位置 <!-- spr ...

  9. POJ-3252 Avenger

    题意:在区间中,他们化成2进制的数的0的个数大于等于1的数有多少个. 思路:我们需要记录上一次0和1的个数,此外我们还要特别注意一下前导0. 如果前面全是0的时候我们就要注意下一位是不是还是0,如果一 ...

  10. php使用include报错require_once(../include.php): failed to open stream: No such file or directo

    引入路径的问题,建议加入include_once $_SERVER['DOCUMENT_ROOT']."/include.php";意思是获取网站根目中的include.php 截 ...