目标:单独创建Hosoya三角形的递归表示。
你的任务:着名数学家Haru Hosoya描述了一个三角形(见下图),这是一个基于Fibonacci数的三角形数字排列。从用户获取高度并使用数组存储每行的值。使用递归方法打印出适当数量的Hosoya三角形。不要认为输入会很好。你还应该实现try ... catch块来捕获错误的输入。
这是我到目前为止的代码:
public class HosoyaTri {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
boolean continueLoop = true;
int num = s.nextInt();
do {
try {
System.out.println("How many levels?");
System.out.println(num + " levels");
continueLoop = false;
} catch (InputMismatchException im) {
System.err.println("I said INTEGER, try again");
s.nextLine();
} catch (Exception e) {
System.err.println("What did you do?");
}
} while (continueLoop);
int triangle[][] = new int[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
triangle[i][j] = 0;
}
}
for (int i = 0; i < num; i++) {
triangle[i][0] = 1;
}
for (int i = 1; i < num; i++) {
for (int j = 1; j < num; j++) {
triangle[i][j] = triangle[i - 1][j - 1] * triangle[i - 1][j];
}
}
for (int i = 0; i < num; i++) {
for (int j = 0; j <= i; j++) {
System.out.print(triangle[i][j] + " ");
}
System.out.println();
}
}
}
答案 0 :(得分:1)
一个问题是您在输入循环之前读取一次级别数。然后,您正在提示某个级别,然后打印num
,而不会给用户任何提供输入的机会!你应该解决这个问题。您还应该针对num <= 0
进行测试。
就如何使用递归而言,Hosoya's triangle中的条目可以递归定义:
H 0,0 = H 1,0 = H 1,1 = H 2,1 = 1
H n,j = H n-1,j + H n-2,j 或 H n,j = H n-1,j-1 + H n-2,j-2
另一个(等效的)定义是:
H n,i = F i + 1 ×F n-i + 1
其中F n 是n th Fibonacci number,递归定义为:
F 0 = 0
F 1 = 1
F n = F n-1 + F n-2 (n> 1)
我建议使用其中一个定义在类中编写一个(递归)静态方法,计算三角形中一个条目的正确值(给定n
和j
作为参数)。然后,您可以消除triangle
变量和初始化它的所有代码。只需运行输出循环并将调用替换为递归方法,现在您可以访问triangle
的特定元素。 (如果由于某种原因你需要显式构建三角形,只需通过调用递归方法初始化每个元素。顺便说一句:没有必要将triangle
的元素初始化为0; Java在矩阵时自动执行分配。)