/
/递归函数:自己调用自己就是递归函数,需要
object t29 {
//1.函数可以自己调用自己----->递归函数
//2.自己调用自己,可能导致死循环
// def fu():Unit ={
// println("fu")
// //函数内部再次调用自己
// fu()
// }
*问题:求1+2...n的和。
* 记:f(n)=1+2+3+4+...+(n-1)+n
* 1.基本情况(直接能求的): f(1)=1
* 2.递归情况(大事化小,自己调用自己)f(n)=f(n-1)+n
* @param n
*/
def getSum(n:Int):Int={
if (n==1){
1
}else{
getSum(n-1)+n
}
}
/**
* 问题:求1*2...n的积。
* 记:f(n)=1*2*3*4*...*(n-1)*n
* 1.基本情况(直接能求的):f(1)=1
* 2.递归情况(大事化小,自己调用自己):f(n)=f(n-1)*n
*
* @param n
*/
def getMul(n:Int):Int={
if (n==1){
1
}else{
getMul(n-1)*n
}
}
/**
* 问题:求 斐波那契数列的第n项。
* 记: 0 1 1 2 3 5 8 13 21 34 ...从第三项开始f(n)=f(n-)+f(n-2)
* 1.基本情况(直接能求的):f(0)=0,f(1)=1
* 2.递归情况(大事化小,自己调用自己):f(n)=f(n-1)+f(n-2)
*
* @param n
*/
def fib(n:Int):Int={
if (n==0){
0
}else if(n==1){
1
}else{
fib(n-1)+fib(n-2)
}
}
/**
* 问题:求 汉罗塔游戏的步骤。
* 记: f(n,"A","B","c")表示把n个盘子从A柱子上移动到C柱子上,借用B柱子的过程
* 1.基本情况(直接能求的):f(1,"A","B","c"),可以直接求,从A----->C.
* 2.递归情况(大事化小,自己调用自己):f(n,"A","B","C")=
* f(n-1,"A","C","B")
* println(s"$A---->$C")
* f(n-1,"A","B","C")
*
* @param n
*/
def han(n:Int,A:String,B:String,C:String):Unit={
if (n==1){
println(s"$A--->$C")
}else{
//把前n-1个盘子(上面的n-1个):从A->B
han(n-1,A,C,B)
//把第n个盘子。从A->C
println(s"$A-->$C")
//把第一步中的前n-1个盘子(上面的n-1),从B->C
han(n-1,B,A,C)
}
}
def main(args: Array[String]): Unit = {
han(3,"A","B","C")
}
}