【问题标题】:Recursive method for multiplying arraylist elements数组列表元素相乘的递归方法
【发布时间】:2020-12-13 20:06:35
【问题描述】:

我希望我的措辞不会太混乱。我正在做一个关于递归的学校项目。我构建了一个 GUI 来允许用户在程序中输入数字。我想将用户输入到 textField 中的数字存储在数组列表中,以便我可以使用递归方法将所有数字相乘。我能够创建数组列表并存储数字,但我似乎无法弄清楚如何递归地将 ArrayList 中的元素相乘。我以为我可以这样做:

numbers.get(numbers.size()) * (numbers.size() - 1)

上述方法不起作用,因为索引总是超出范围。我也不确定我是否理解这里发生的事情。

我有一个单独的驱动程序类,它调用 GUI 类来运行程序。见下文。

public class Gui {
    final static boolean shouldFill = true;
    final static boolean shouldWeightX = true;
    final static boolean RIGHT_TO_LEFT = false;
    //Array list to store user input.
    public static List<Integer> numbers = new ArrayList<>();
    public static int num;
    //recursive Method
    public static int calculate(){


        return(0);
    }

    //Gui Program
    public static void addComponents(Container pane){
        if(RIGHT_TO_LEFT){
            pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }

        JLabel label;
        pane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        if(shouldFill){
            c.fill = GridBagConstraints.HORIZONTAL;
        }
        //Instruction Label
        label = new JLabel("Welcome to recursion! Enter 5 numbers below.");
        if (shouldWeightX){
            c.weightx = 0.5;
        }
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;
        c.insets = new Insets(5, 10, 5, 10);
        pane.add(label, c);

        JLabel label1 = new JLabel("Enter Numbers:");
        c.gridx = 0;
        c.gridy = 1;
        pane.add(label1, c);

        JTextField tf = new JTextField();
        //Accepts only numbers 1 - 9. Zero defeats the purpose of the program.
        tf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent ke) {
               tf.getText();
               if(ke.getKeyChar()>='1' && ke.getKeyChar()<='9' || ke.getKeyChar()== KeyEvent.VK_BACK_SPACE){
                   tf.setEditable(true);
               }else{
                   tf.setEditable(false);
                   label.setText("You must enter numeric digits 1-9");
               }
            }
        });
        c.gridx = 1;
        c.gridy = 1;
        c.insets = new Insets(0, 105, 0,10);
        pane.add(tf, c);

        JLabel outLabel = new JLabel(" ");
        c.gridx = 0;
        c.gridy = 4;
        c.gridwidth = 2;
        c.insets = new Insets(0,10,10,0);
        pane.add(outLabel, c);


        JButton b = new JButton("Submit");
        b.addActionListener(e -> {
            try {

                num = Integer.parseInt(tf.getText());
                numbers.add(num);
                outLabel.setText(String.valueOf(numbers));
                tf.setText("");

            }catch (Exception x){
                outLabel.setText("Please make sure you have entered a number!");
            }
        });
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 2;
        c.insets = new Insets(10,25, 10,25);
        pane.add(b, c);

        JButton b2 = new JButton("Multiply!");


        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 2;
        c.insets = new Insets(0,25, 10,25);
        pane.add(b2, c);

    }

    public static void createGui(){
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Recursive Multiplication");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addComponents(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
    }



}

【问题讨论】:

    标签: java recursion arraylist


    【解决方案1】:

    首先,您必须为乘法按钮创建逻辑,例如:

      JButton b2 = new JButton("Multiply!");
        b2.addActionListener(e -> {
            try {
                num = Integer.parseInt(tf.getText());
                int result = multiple_recursive(numbers, 0);
                // choose label to set the value.
                  
    
            }catch (Exception x){
                // solve exception
            }
        });
    

    然后定义递归乘法的方法:

    public static int multiple_recursive(List<Integer> numbers, int count){
        if(numbers.size() == count){
            return 1;
        }
           return numbers.get(count) * multiple_recursive(numbers, count + 1);
    }
    

    所以想法是传递listcount 变量。这个count 将告诉数字列表的当前位置。对于每个递归调用,您从列表numbers.get(count) 中获取当前元素并再次递归调用,但将一个添加到当前count multiple_recursive(numbers, count + 1);。一旦当前的count 与列表大小相同,递归调用应该停止,我们返回 1,因为该值的乘法标识属性。

    对于包含元素 {5, 2, 10} 的列表。迭代将是这样的:

    1. numbers.size() == count False
    2. return numbers.get(0) * multiple_recursive(numbers, 1);
    3. return 5 * (multiple_recursive(numbers, 1));
    4. return 5 * (numbers.get(1) * multiple_recursive(numbers, 2));
    5. return 5 * (2 * multiple_recursive(numbers, 2));
    6. return 5 * (2 * (numbers.get(2) * multiple_recursive(numbers, 3)));
    7. return 5 * (2 * (10 * multiple_recursive(numbers, 3)));
    8. 既然 numbers.size() == count 为 True,那么
    9. 返回 5 * (2 * (10 * 1));
    10. 返回 50

    【讨论】:

    • 谢谢你的解释帮助我澄清了几件事。我需要更多地练习它才能擅长它。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多