📄 fibonacciserial.java
字号:
//本例题对书中代码稍加改动:msg数组下标扩充到150,另增加了输入数据的检查(1~9)
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class FibonacciSerial extends Applet implements ActionListener //定义主类
{
Label prompt = new Label("请输入菲波那契数列的长度(最大为10):");
TextField input = new TextField(5); //输入数列位置的区域
String[] msg = new String[150]; //记录各次递归调用的情况
int RequireCnt = 0; //记录Fibonacci()方法调用次数
int ReturnCnt = 0; //记录Fibonacci()方法返回次数
public void init()
{
add(prompt);
add(input);
input.addActionListener(this);
for(int i=0;i<150;i++)
msg[i] = "";
}
public void paint(Graphics g) //显示各次递归调用情况
{
for(int i=0;i<RequireCnt+ReturnCnt+1;i++)
g.drawString(msg[i],10,40+15*i);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == input) //用户输入数据后将计数器清零
{
RequireCnt = 0;
ReturnCnt = 0;
if(Integer.parseInt(input.getText())>=10 ||
Integer.parseInt(input.getText())<=0) //检查是否输入太大
{
prompt.setText("请输入小于10的正整数:");
input.setText(""); //重新输入
}
else //调用菲波那契方法求取指定位置处数据
Fibonacci(Integer.parseInt(input.getText())-1);
}
repaint();
}
long Fibonacci(int n) //菲波那契方法
{
long temp;
RequireCnt++; //调用次数加1
msg[RequireCnt+ReturnCnt] = Blanks(RequireCnt,ReturnCnt)
+ "Fibonacci(" + n + "):";//记录调用
if( n==0 || n==1 )
{
ReturnCnt++;//返回次数加1
msg[RequireCnt+ReturnCnt] = Blanks(RequireCnt,ReturnCnt-1)
+ "返回" + n; //记录返回
return n;//递归头
}
else
{
temp = Fibonacci(n-1)+Fibonacci(n-2); //调用自身
ReturnCnt++;//返回次数加1
msg[RequireCnt+ReturnCnt] = Blanks(RequireCnt,ReturnCnt-1)
+ "返回" + temp; //记录返回
return temp;
}
}
String Blanks(int stepIn,int stepBack) //计算显示递归调用层次的缩进字符串
{
String blank = "";
for(int i=0;i<(stepIn-stepBack);i++)
blank = blank + " ";
return blank;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -