《数据结构和Java集合框架第三版》读书笔记(一)递归

时间:2022-12-07 17:53:42

一,十进制转二进制

计算十进制(12)转二进制

递归函数的设计:双层

外层getBinary()抓异常

内层getBin递归计算

 

 

public static String getBin (int n){

if (n <= 1)

    return Integer.toString (n);

return getBin (n / 2) + Integer.toString (n % 2);

}

 

《数据结构和Java集合框架第三版》读书笔记(一)递归

 

递归调用的次数是n2除直到最后结果为1所需要的次数,这个值为floor(log2(n))

floor(x)小于或等于x的最小整数

 

二,斐波那契数列

11235813……

n>3时,f(n)=f (n - 1) + f (n - 2)

直接用这个公式递归,会导致最坏情况远行时间很高

假设计算f(n)需要c(n)次运算

c(1)=c(2)=1

n>3时,c(n)=1+c(n-1)+c(n-2)

可用数学归纳法证明c(n)=2*f(n)-1

worstTime(n) ~ c (n) = 2*f(n) - 1

worstTime(n)=Θ(f (n))

 

f (n) = (1 /5)(((1 +5) / 2)n - ((1 -5) / 2)n)

n->无穷大时,(1 - 5) / 2)->0

f (n), and worstTime (n), isΘ (((1 + 5) / 2)n),太大

所以对斐波那契数列用for循环里迭代法比较好

 

public static long fibonacci(int n){
if(n==0)
return 0;
if(n==1)
return 1;
long fibN1=0,fibN2=1,fibN=0;
for(int i=2;i<=n;i++){
fibN=fibN1+fibN2;
fibN1=fibN2;
fibN2=fibN;
}
return fibN;
}

斐波那契题目变形:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

 把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,

此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);

另一种选择是第一次跳2级,此时跳法数目等于后面剩下n-2级台阶的跳法数目,即为f(n-2)。

因此,n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2)。斐波那契数列。

三,汉诺塔

三个塔座:Origin(初始地点),Destination(目的地点),Temporary(临时地点,用来中转)

要将n个圆盘从Origin移动到Destination

《数据结构和Java集合框架第三版》读书笔记(一)递归

如果n=1,则直接将它从Origin移动到Destination

如果n>1

1,首先将n-1个圆盘从塔座Origin移动到Temporary

《数据结构和Java集合框架第三版》读书笔记(一)递归

2,然后把第n个圆盘从从Origin移动到Destination

3,接着将n-1个圆盘从Temporary移动到Destination

1和3两个步骤都是在递归

 

代码:仍然是分两层:moveDisks抛出异常,move做具体的递归操作

 

public static String moveDisks (int n, char orig, char dest, char temp) 
{
// throw new UnsupportedOperationException();
if (n <= 0)
throw new IllegalArgumentException( );
return move (n, orig, dest, temp);
} // method moveDisks

public static String move (int n, char orig, char dest, char temp)
{
final String DIRECT_MOVE =
"Move disk " + n + " from " + orig + " to " + dest + "\n";

if (n == 1)
return DIRECT_MOVE;
String result = move (n - 1, orig, temp, dest);
result += DIRECT_MOVE;
result += move (n - 1, temp, dest, orig) ;
return result;
} // method move


 

四,间接递归

活动:一个方法如果正在执行,或者由一个活动的方法调用,称这个方法是活动的

递归:一个方法如果在活动时能被调用,则称这个方法是递归的

《数据结构和Java集合框架第三版》读书笔记(一)递归

B、C、D均为递归方法,间接递归

 

 活动记录:关于当前活动方法的执行状态的信息。编译器实现保存和获取活动记录的机制是堆栈,将在第七章讨论。