1、求n的阶乘
利用递归实现
fun main(args: Array<String>) {
val v=5
println(fact(v))
}
fun fact(value:Int):Int{
if(value==1)
{
return 1
}
else{
return fact(value-1)*value
}
}
输出:
2、利用迭代的方式
就是遍历相乘
fun main(args: Array<String>) {
val v=5
println(iteration(v))
}
fun iteration(value:Int):Int{
val range=1..value
var result=1
range.forEach {
result*=it
}
return result
}
结果:
3、计算1到n的和
递归
fun main(args: Array<String>) {
val v=100000
println(fact(v))
}
fun fact(value:Int):Int{
if(value==1)
{
return 1
}
else{
return fact(value-1)+value
}
}
结果栈溢出
迭代呢:
fun main(args: Array<String>) {
val v=100000
println(iteration(v))
}
fun iteration(value:Int):Long{
val range=1..value
var result=1L
range.forEach {
result+=it
}
return result
}
结果:
递归和迭代相比,有其局限性,层级不能太深,否则会栈溢出,但是递归实现起来思路比较简单,那么能不能对递归进行优化呢?可以的,就是先转化为尾递归,再加关键字(关键字tailrec)
3、尾递归(只有尾递归才能优化)
什么是尾递归呢?就是调用自身之后不再做其他操作
return fact(value-1)+value,这个代码就不是尾递归,因为调用了自身之后还执行了加操作
优化上面的递归
fun main(args: Array<String>) {
val v=100000
println(tailFact(v))
}
tailrec fun tailFact(value:Int,result:Long=1L):Long{
if(value==1)
{
return result+1
}
else{
return tailFact(value-1,result+value)
}
}
输出: