Android-Kotlin-递归与尾递归
递归:
阶乘计算:
/**
* 阶乘:
* 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-递归与尾递归的更多相关文章
- 递归与尾递归(C语言)
原文:递归与尾递归(C语言)[转] 作者:archimedes 出处:http://www.cnblogs.com/archimedes/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留 ...
- JAVA中使用递归和尾递归实现1000的阶乘的比较
在JAVA中求阶乘首先遇到的问题就是结果溢出,不管是使用int还是long,double都无法表示1000!这么大的天文数字,这里暂且用BigInteger解决这个问题! 下面是使用递归和尾递归分别计 ...
- day13-Python运维开发基础(递归与尾递归)
递归与尾递归 # ### 递归函数 """ 递归函数: 自己调用自己的函数 递:去 归:回 有去有回是递归 """ # 简单递归 def d ...
- 递归、尾递归和使用Stream延迟计算优化尾递归
我们在学数据结构的时候必然会接触栈(Stack),而栈有一个重要的应用是在程序设计语言中实现递归.递归用途十分广泛,比如我们常见的阶乘,如下代码: 1234 public static int (in ...
- kotlin递归&尾递归优化
递归: 对于递归最经典的应用当然就是阶乘的计算啦,所以下面用kotlin来用递归实现阶乘的计算: 编译运行: 那如果想看100的阶乘是多少呢? 应该是结果数超出了Int的表述范围,那改成Long型再试 ...
- 递归与尾递归(C语言)【转】
作者:archimedes 出处:http://www.cnblogs.com/archimedes/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原 ...
- 接收Android数据 递归显示表格数据
<html> <head> <title>展示</title> <script type="text/javascript" ...
- Android Kotlin —— 语言结合
2017 Google I/O 大会开始就宣布,将Kotlin语言作为安卓开发的一级编程语言. Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发. Ko ...
- android sqlite 递归删除一棵子树
背景:android studio 3.0 GreenDao 目标:在android 中,如何做到递归删除某颗子树?? ======================================== ...
- Android Kotlin适用小函数
都是一些Android适用的Kotlin小函数. 1.点击空白隐藏键盘 //点击空白隐藏键盘 override fun onTouchEvent(event: MotionEvent): Boolea ...
随机推荐
- postfix 如何设置邮件头翻译的功能
开始按http://semi-legitimate.com/blog/item/how-to-rewrite-outgoing-address-in-postfix 博客中的方法进行设置,是可以替换, ...
- LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流
#6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- PHP 批量移动文件改名
public function changeCoverName(){ //$type = '考研'; //$coverPath = './Public/course_cover/kaoyan/'; $ ...
- 摹客 iDoc 12月上半月新功能点评
转眼就到了2018年的最后一个月,小伙伴们是不是都在奋力拼搏做年底的冲刺呢?摹客也没有放慢脚步,不断地优化,给大家带来一个又一个的惊喜.那么,让小摹来带大家看看12月摹客iDoc更新了哪些特色功能: ...
- mongoDB(Linux)
启动 service mongod start 安装好后,输入mongo进入控制台 创建数据库 use baseName db.createCollection("game_record& ...
- 【Linux】percona-toolkit工具包的安装
一.检查和安装与Perl相关的模块 PT工具是使用Perl语言编写和执行的,所以需要系统中有Perl环境. 依赖包检查命令为: rpm -qa perl-DBI perl-DBD-MySQL perl ...
- 832. Flipping an Image
class Solution { public: vector<vector<int>> flipAndInvertImage(vector<vector<int& ...
- thinkphp5 数据库和模型
1.Db和模型的存在只是ThinkPHP5.0架构设计中的职责和定位不同,Db负责的只是数据(表)访问,模型负责的是业务数据和业务逻辑.2.Db和模型最明显的一个区别就是Db查询返回的数据类型为数组( ...
- 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)
传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...
- MFC单文档带窗体创建
我用的vs05.先随便起个名字qwerty. 确定以后在左边最下面有一个生成的类,点击生成的类,把基类改成CFormView 最后点击完成就创建好了. 单文档的窗口不是后来创建后插入的,是在创建后就自 ...