递归函数是一个连续调用自身的函数。这种技术称为递归。
句法
fun functionName(){.. .. ..functionName() //calling same function}
Kotlin递归函数示例1:有限的时间
让我们看一个递归函数打印计数的例子。
var count = 0fun rec(){count++;
if(count<
=5){println("hello "+count);
rec();
}}fun main(args: Array<
String>
) {rec();
}
【Kotlin递归函数】输出:
hello 1hello 2hello 3hello 4hello 5
Kotlin递归函数示例2:阶乘数
让我们看一个递归函数计算数字阶乘的例子。
fun main(args: Array<
String>
) {val number = 5val result: Longresult = factorial(number)println("Factorial of $number = $result")}fun factorial(n: Int): Long {return if(n == 1){n.toLong()}else{n*factorial(n-1)}}
输出:
Factorial of 5 = 120
以上析因示例的工作过程
factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) return 1 return 2*1 = 2 return 3*2 = 6 return 4*6 = 24 return 5*24 = 120
Kotlin尾递归在讨论尾递归之前, 让我们尝试举一个使用常规(普通)递归计算第n个(大100000)数字之和的示例。
一般递归
让我们看一个使用普通(普通)递归来计算第n个(大于100000的数字)之和的示例。
fun main(args: Array<
String>
) {var result = recursiveSum(100000)println(result)}fun recursiveSum(n: Long) : Long {return if (n <
= 1) {n} else {n + recursiveSum(n - 1)}}
输出:
Exception in thread "main" java.lang.StackOverflowError
上面的示例抛出“ java.lang.StackOverflowError”异常。这是因为编译器无法调用大量的递归函数调用。
尾递归
尾递归是先执行计算然后进行递归调用的递归。当前步骤的结果将传递到下一个递归调用中。
尾递归遵循一个实现规则。该规则如下:
递归调用必须是该方法的最后一个调用。要将递归声明为尾递归, 我们需要在递归函数之前使用tailrec修饰符。
Kotlin尾递归示例1:计算nth(100000)个数字的太阳
让我们看一个使用尾部递归计算n的和(大100000)的示例。
fun main(args: Array<
String>
) {var number = 100000.toLong()var result = recursiveSum(number)println("sun of upto $number number = $result")}tailrec fun recursiveSum(n: Long, semiresult: Long = 0) : Long {return if (n <
= 0) {semiresult} else {recursiveSum( (n - 1), n+semiresult)}}
输出:
sun of upto 100000 number = 5000050000
Kotlin尾递归示例2:计算数字阶乘
让我们看一个使用尾部递归计算数字阶乘的示例。
fun main(args: Array<
String>
) {val number = 4val result: Longresult = factorial(number)println("Factorial of $number = $result")}tailrec fun factorial(n: Int, run: Int = 1): Long {return if (n == 1){run.toLong()} else {factorial(n-1, run*n)}}
输出:
Factorial of 4 = 24
推荐阅读
- Kotlin反射
- Kotlin运算符
- Kotlin Null安全类型
- Kotlin嵌套try-catch块
- Kotlin嵌套类和内部类
- Kotlin MutableSet接口
- Kotlin MutableMap接口
- Kotlin MutableList(mutableListOf())
- Kotlin可变数组