开发者学堂课程【Scala 核心编程-基础:函数递归的课堂练习】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8932
函数递归的课堂练习
内容介绍
一、案例一
二、案例二
三、案例三
关于函数的递归,下面布置了三个题。
一、案例一
1、题1:斐波那契数
请使用递归的方式,求出斐波那契数1,1,2,3,5,8,13...
给你一个整数 n,求出它的斐波那契数是多少?
首先新建一个 object 类 Exercise01,写入函数 def,名称为 fbn,传入参数 n 为 Int 类型,最后要返回一个 int,这里在递归的推导时不能使用:Unit 形式,后面会讲到,然后进行分析题目:
2、思路分析:
分析题目的当 n=1时,返回值为1,当 n=2时返回值也为1,当 n=3也就是 n>2时,返回值为前面两个数相加,返回值为3。
3、代码的实现:
package com. atguigu. chapter05. recursive
object Exercise01 {
def main(args: Array[String]): Unit = {
println("fbn的结果是=”+ fbn(3))
//进行输出 fbn(3)的结果,输出应该为2
}
//函数
def fbn(n: Int): Int = {
//分析
//1.当 n=1结果为1
//2.当 n=2结果是1
//3. 当 n> 2时,结果就是前面两个数的和
if(n==1|| n==2){
//如果当 n=1或者 n=2时则返回值1
1
} else {
//如果大于2,则执行下面语句
fbn(n-1)+fbn(n-2)
//不需要 return,最后一行就代表了结果
}
}}
运行结果:
D: \program\jdk8\bin\java
fbn 的结果是=2
可以看到运行结果是正确的。那如果输出 fbn(7)结果为:
D: \program\jdk8\bin\java
fbn 的结果是=13
运行结果也是正确的,说明案例代码实现成功。
二、案例二
1、题2:求函数值[演示]
已知f(1)=3; f(n) = 2*f(n-1)+1;
请使用递归的思想编程,求出 f(n)的值?(就是简单的套用公式即可)
2、代码实现如下:
…
println
(f(2))
//进行输出 f((2)),运行结果应该为7
}
def f(n: Int): Int = {
//函数f传入参数 n,返回为 Int,
if (n ==1) {
//进行判断如果 n=1,则返回3
3
}else {
//否则,执行下面语句
2 *f(n-1)+1
//题目给出的公式
}
运行结果:
D: \program\jdk8\bin\java
fbn的结果是=13
7
可以看到输出结果为7,说明案例2实现成功。
三、案例三
1、题3:猴子吃桃子问题
有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃
其中的一半,然后再多吃一个。当到第十天时,想再吃时(还没吃),发现只有
1个桃子了。问题:最初共多少个桃子?
2、思路分析:
可以知道,第10天时桃子有1个,那么第9天,桃子有(1+1)×2个,就是(day10[1]+1)×2,第8天时桃子就有(day9[?]+1)×2个,day9时有4个,通过以上分析规律就清楚了,规律为要算前一天的桃子数就要把后一天的桃子数加一再乘以2。
3、代码实现:
…
println
(
“桃子个数=“+
peach(1))
//输出结果应该为1534
}
/*分析思路
1.day=10桃子有1
2. day = 9桃子有(day10[1] + 1) *2
3.day=8桃子有(day9[4]+1)*2
*/
def peach(day: Int): Int = {
//传入要求第几天的桃子数,返回类型为整数
if (day ==10) {
//如果传入天数为10则返回1
} else {
(peach(day + 1) + 1) * 2
//比如要算第9天的数量,就是((9+1)+1)*2,这里的逻辑是从后往前推,与前面的从前往后推不同
}
}
运行结果:
运行结果:
D: \program\jdk8\bin\java
…
桃子个数=1534
以上就是使用 scala 完成递归的应用案例