在java的Hosoya三角形

时间:2013-03-28 16:44:33

标签: java

目标:单独创建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();
        }
    }

}

1 个答案:

答案 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)

我建议使用其中一个定义在类中编写一个(递归)静态方法,计算三角形中一个条目的正确值(给定nj作为参数)。然后,您可以消除triangle变量和初始化它的所有代码。只需运行输出循环并将调用替换为递归方法,现在您可以访问triangle的特定元素。 (如果由于某种原因你需要显式构建三角形,只需通过调用递归方法初始化每个元素。顺便说一句:没有必要将triangle的元素初始化为0; Java在矩阵时自动执行分配。)