一、递推连分式开根号
问题描述:计算2\sqrt{2}2
(2+1)(2−1)=(2)2−12=2−1=1(\sqrt{2}+1)(\sqrt{2}-1)=(\sqrt{2})^2-1^2=2-1=1(2+1)(2−1)=(2)2−12=2−1=1
由此得到2−1=11+2=11+1+2−1=12+2−1\sqrt{2}-1=\frac{1}{1+\sqrt{2}}=\frac{1}{1+1+\sqrt{2}-1}=\frac{1}{2+\sqrt{2}-1}2−1=1+21=1+1+2−11=2+2−11
令x=2−1x=\sqrt{2}-1x=2−1,由上式可得x=12+xx=\frac{1}{2+x}x=2+x1
由此递推可得x=12+12+12+12+....x=\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+....}}}}x=2+2+2+2+....1111
程序代码:
public class SqrtDitui {
public static void main(String[] args) {
System.out.println(Math.sqrt(2));
double ans=0;
for(int i=1;i<=100;i++) ans=1.0/(2+ans);//x=1/(2+x)
System.out.println(ans+1);
}
}
运行结果:
1.4142135623730951
1.4142135623730951
二、递归汉诺塔
问题描述:现有A、B、C三根柱子,A柱子套着n
个圆盘,且大的圆盘放在下面,从大到小往上叠放。现在需要将圆盘套到C柱子上,规则是:大圆盘不能压着小圆盘,最终效果为保持原有顺序,一次只能移动一个圆盘。问如何以最少的次数移动完成?
程序代码:
import java.util.Scanner;
public class HanNuoTaDigui {
public static int step=1;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
step = 1;
hannuota(n,'A','B','C');
}
}
public static void hannuota(int n, char A, char B,char C) {
if(n==1) System.out.printf("第%03d步,将%03d盘子%c->%c\n",step++,n,A,C);
else {
hannuota(n-1,A,C,B);//前n-1个移动到B盘,为n空出位置方便从A移动到C
System.out.printf("第%03d步,将%03d盘子%c->%c\n",step++,n,A,C);
hannuota(n-1,B,A,C);//完成所有n个到C盘
}
}
}
运行结果:
3
第001步,将001盘子A->C
第002步,将002盘子A->B
第003步,将001盘子C->B
第004步,将003盘子A->C
第005步,将001盘子B->A
第006步,将002盘子B->C
第007步,将001盘子A->C