示例:
object Demos01 {
//一个函数在函数体内又调用了本身,我们称为递归调用
def main(args: Array[String]): Unit = {
// test(4)
test2(4) //输出
}
def test (n: Int): Unit ={
if(n > 2){
test(n - 1)
}
println("n=" + n)
}
def test2 (n: Int): Unit ={
if (n > 2) {
test2 (n - 1)
}else{
println("n=" + n)
}
}
}
总结:
1 程序执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
2 函数的局部变量是独立的,不会相互影响
3 递归必须向退出递归的条件逼近,否则就是无限递归,死"龟"了
4 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。
案例1 斐波那契数 请使用递归的方式,求出斐波那契数1,2,3,5,8,13… 给你一个整数n,求出它的斐波那契数是多少?
分析
1 当n=1结果为1
2 当n=2结果为1
3 当n>2时,结果就是前两个数的和
object Exercise01 {
def main(args: Array[String]): Unit = {
println(f(2))
}
def f(n:Int): Int ={
if(n == 1){
3
}else{
2 * f(n-1) + 1
}
}
}
案例2 求函数值 已知f(1)=3; f(n)=2*f(n-1)+1; 请使用递归的思想编程,
求出f(n)的值
object Exercise01 {
def main(args: Array[String]): Unit = {
println(f(2))
}
def f(n:Int): Int ={
if(n == 1){
3
}else{
2 * f(n-1) + 1
}
}
}
案例3 猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个,当到第十天时,想在吃时(还没吃),发现只有1个桃子了,问题:最初共有多少个桃子?
分析思路:
1 day = 10 桃子有1
2 day = 9 桃子有 (day10[1] + 1)*2)
3 day = 8 桃子有(day9[4]+1)*2
object Exercise01 {
def main(args: Array[String]): Unit = {
println("桃子个数=" + peach(1)) //1534
}
def peach(day:Int): Int ={
if(day == 10){
1
}else{
(peach(day + 1) + 1) * 2
}
}