递归:

对于递归最经典的应用当然就是阶乘的计算啦,所以下面用kotlin来用递归实现阶乘的计算:

编译运行:

那如果想看100的阶乘是多少呢?

应该是结果数超出了Int的表述范围,那改成Long型再试下:

呃~~还是显示为0,那就没有方法能看到100的阶乘是多少了么,当然有!!这时需要用到另外一个数据类型啦,貌似平常没怎么用到过,如下:

好大~~

尾递归优化:
这里再用递归来实现数字的累加,其规则跟阶乘类似:1的累加=1、2的累加=2+1、3的累加=3+2+1、4的累加=4+3+2+1,实现当然so easy啦:

那100000它的累加结果是多少呢?

那是递归多少次就崩掉了呢,打印个日志看一下:

那如何解决能看到十万数的累加结果呢?如果是java貌似木有太好的办法,但是!!在kotlin中出现了一个尾递归能解决这个问题,具体做法:

但是报警告了,看一下:

这里要说明一下:要使用尾递归来对递归做优化的话,需要return的代码必须是调用函数本身,而目前的代码是这样:

那如何改造一下下呢?

先来用100看一下输出是否准确:

计算机第100次运算,result=0
计算机第99次运算,result=100
计算机第98次运算,result=199
计算机第97次运算,result=297
计算机第96次运算,result=394
计算机第95次运算,result=490
计算机第94次运算,result=585
计算机第93次运算,result=679
计算机第92次运算,result=772
计算机第91次运算,result=864
计算机第90次运算,result=955
计算机第89次运算,result=1045
计算机第88次运算,result=1134
计算机第87次运算,result=1222
计算机第86次运算,result=1309
计算机第85次运算,result=1395
计算机第84次运算,result=1480
计算机第83次运算,result=1564
计算机第82次运算,result=1647
计算机第81次运算,result=1729
计算机第80次运算,result=1810
计算机第79次运算,result=1890
计算机第78次运算,result=1969
计算机第77次运算,result=2047
计算机第76次运算,result=2124
计算机第75次运算,result=2200
计算机第74次运算,result=2275
计算机第73次运算,result=2349
计算机第72次运算,result=2422
计算机第71次运算,result=2494
计算机第70次运算,result=2565
计算机第69次运算,result=2635
计算机第68次运算,result=2704
计算机第67次运算,result=2772
计算机第66次运算,result=2839
计算机第65次运算,result=2905
计算机第64次运算,result=2970
计算机第63次运算,result=3034
计算机第62次运算,result=3097
计算机第61次运算,result=3159
计算机第60次运算,result=3220
计算机第59次运算,result=3280
计算机第58次运算,result=3339
计算机第57次运算,result=3397
计算机第56次运算,result=3454
计算机第55次运算,result=3510
计算机第54次运算,result=3565
计算机第53次运算,result=3619
计算机第52次运算,result=3672
计算机第51次运算,result=3724
计算机第50次运算,result=3775
计算机第49次运算,result=3825
计算机第48次运算,result=3874
计算机第47次运算,result=3922
计算机第46次运算,result=3969
计算机第45次运算,result=4015
计算机第44次运算,result=4060
计算机第43次运算,result=4104
计算机第42次运算,result=4147
计算机第41次运算,result=4189
计算机第40次运算,result=4230
计算机第39次运算,result=4270
计算机第38次运算,result=4309
计算机第37次运算,result=4347
计算机第36次运算,result=4384
计算机第35次运算,result=4420
计算机第34次运算,result=4455
计算机第33次运算,result=4489
计算机第32次运算,result=4522
计算机第31次运算,result=4554
计算机第30次运算,result=4585
计算机第29次运算,result=4615
计算机第28次运算,result=4644
计算机第27次运算,result=4672
计算机第26次运算,result=4699
计算机第25次运算,result=4725
计算机第24次运算,result=4750
计算机第23次运算,result=4774
计算机第22次运算,result=4797
计算机第21次运算,result=4819
计算机第20次运算,result=4840
计算机第19次运算,result=4860
计算机第18次运算,result=4879
计算机第17次运算,result=4897
计算机第16次运算,result=4914
计算机第15次运算,result=4930
计算机第14次运算,result=4945
计算机第13次运算,result=4959
计算机第12次运算,result=4972
计算机第11次运算,result=4984
计算机第10次运算,result=4995
计算机第9次运算,result=5005
计算机第8次运算,result=5014
计算机第7次运算,result=5022
计算机第6次运算,result=5029
计算机第5次运算,result=5035
计算机第4次运算,result=5040
计算机第3次运算,result=5044
计算机第2次运算,result=5047
计算机第1次运算,result=5049

呃,100的累加值照理不是5050的嘛,那结果少了一个1,这时应该更改一下条件了,当第0次运算的时候还得加上它才行:

这次结果对了,那再来算一下10万数的结果:

可以kotlin真的挺强大的~

kotlin递归&尾递归优化的更多相关文章

  1. [Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .

    递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...

  2. Scala进阶之路-尾递归优化

    Scala进阶之路-尾递归优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 递归调用有时候能被转换成循环,这样能节约栈空间.在函数式编程中,这是很重要的,我们通常会使用递归方法来 ...

  3. 对SNL语言的解释器实现尾递归优化

    对于SNL语言解释器的内容可以参考我的前一篇文章<使用antlr4及java实现snl语言的解释器>.此文只讲一下"尾递归优化"是如何实现的--"尾递归优化& ...

  4. Python尾递归优化

    Python开启尾递归优化 cpython本身不支持尾递归优化, 但是一个牛人想出的解决办法:实现一个 tail_call_optimized 装饰器 #!/usr/bin/env python2.4 ...

  5. 逆转序列的递归/尾递归(+destructuring assignment)实现(JavaScript + ES6)

    这里是用 JavaScript 做的逆转序列(数组/字符串)的递归/尾递归实现.另外还尝鲜用了一下 ES6 的destructuring assignment + spread operator 做了 ...

  6. .NET 4.6的RyuJIT尾递归优化的Bug

    今天看到园子里有一篇新闻稿.NET 4.6的RyuJIT编译器中发现严重的Bug提到,在.Net 4.6的x64程序中默认启用新的JIT程序RyuJIT在处理尾递归指令的时候有一个Bug,导致无法得到 ...

  7. 【Scala】尾递归优化

    以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么.在函数式编程中,随处可见递归思想的运用.下面给出几个递归函数的例子: object RecursiveExample extends App{ ...

  8. Py编程方法,尾递归优化,map函数,filter函数,reduce函数

    函数式编程 1.面向过程 把大的问题分解成流程,按照流程来编写过程 2.面向函数 面向函数编程=编程语言定义的函数+数学意义上的函数先弄出数学意义上的方程式,再用编程方法编写这个数学方程式注意面向函数 ...

  9. 斐波那契数列 递归 尾递归 递推 C++实现

    ==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...

随机推荐

  1. JAVA实验报告及第七周总结

    JAVA第六周作业 实验报告五 第一题 1.设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法. 继承该抽象类定义三角型.矩形.圆. 分别创建一个三角形.矩形.圆存对象,将各类图 ...

  2. PYTHON 100days学习笔记007-3:字符串和常用数据结构

    目录 Day007:字符串和常用数据结构 1.使用字符串 2.使用列表 3.使用元组 4.使用字典 4.练习 4.1:在屏幕上显示跑马灯文字 4.2 设计一个函数产生指定长度的验证码,验证码由大小写字 ...

  3. *【Python】【demo实验27】【练习实例】【定义递归函数】

    原题: 原题解答: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- # 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出 ...

  4. SQL Server 验证身份证合法性函数(使用VBScript.RegExp)

    原文:SQL Server 验证身份证合法性函数(使用VBScript.RegExp) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wzy0623 ...

  5. Spring中 如果该Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?

    方法一:Controller中注入service的时候使用@Autowired自动注入,@Qualifier("beanId") 来指定注入哪一个. 方法二:Controller中 ...

  6. supersocket特征

    SuperSocket, 可扩展的 Socket 服务器框架 SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Sock ...

  7. poj 3320 复习一下尺取法

    尺取法(two point)的思想不难,简单来说就是以下三步: 1.对r point在满足题意的情况下不断向右延伸 2.对l point前移一步 3.  回到1 two point 对连续区间的问题求 ...

  8. 6-Perl 标量

    1.Perl 标量标量是一个简单的数据单元.标量可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页.以下实例演示了标量的简单应用:实例#!/usr/bin/perl$age = 20; # ...

  9. flume收集日志直接sink到oracle数据库

    因为项目需求,需要保存项目日志.项目的并发量不大,所以这里直接通过flume保存到oracle 源码地址:https://github.com/jaxlove/fks/tree/master/src/ ...

  10. java——HashSet中add()方法不能加重复值得原因理解(我们一起来看底层代码吧)

    Set<String> names = new HashSet<>(); names.add("张三"); names.add(new String(&qu ...