0

目标:单独创建细谷三角形的递归表示。

你的任务:著名数学家 Haru 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();
        }
    }

}
4

1 回答 1

1

一个问题是您在输入循环之前读取了一次级别数。然后,您会提示您输入一个级别,然后num在不给用户任何提供输入的机会的情况下进行打印!你应该解决这个问题。您还应该针对num <= 0.

至于如何使用递归,细谷三角形中的条目可以递归定义:

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 斐波那契数,递归定义为:

F 0 = 0
F 1 = 1
F n = F n-1 + F n-2 (n > 1)

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

于 2013-03-28T16:51:01.437 回答