Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组列表元素相乘的递归方法_Java_Recursion_Arraylist - Fatal编程技术网

Java 数组列表元素相乘的递归方法

Java 数组列表元素相乘的递归方法,java,recursion,arraylist,Java,Recursion,Arraylist,我希望我的措辞不要太混乱。我正在做一个关于递归的学校项目。我构建了一个GUI,允许用户在程序中输入数字。我想将用户输入到文本字段中的数字存储在数组列表中,以便使用递归方法将所有数字相乘。我能够创建数组列表并存储数字,但我似乎不知道如何递归地乘以ArrayList中的元素。我想我可以这样做: numbers.get(numbers.size()) * (numbers.size() - 1) 上述方法不起作用,因为索引总是超出范围。我也不太清楚这里发生了什么 我有一个单独的驱动程序类,它调用GU

我希望我的措辞不要太混乱。我正在做一个关于递归的学校项目。我构建了一个GUI,允许用户在程序中输入数字。我想将用户输入到文本字段中的数字存储在数组列表中,以便使用递归方法将所有数字相乘。我能够创建数组列表并存储数字,但我似乎不知道如何递归地乘以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);
    }



}
公共类Gui{
最终静态布尔值shouldFill=true;
最终静态布尔值shouldWeightX=true;
最终静态布尔值从右到左=false;
//用于存储用户输入的数组列表。
公共静态列表编号=new ArrayList();
公共静态整数;
//递归方法
公共静态int计算(){
返回(0);
}
//图形用户界面程序
公共静态void addComponents(容器窗格){
如果(从右到左){
窗格.setComponentOrientation(ComponentOrientation.RIGHT\u至\u LEFT);
}
JLabel标签;
setLayout(新的GridBagLayout());
GridBagConstraints c=新的GridBagConstraints();
如果(应填写){
c、 填充=GridBagConstraints.HORIZONTAL;
}
//指示标签
label=newjlabel(“欢迎使用递归!在下面输入5个数字”);
if(shouldldwertx){
c、 权重x=0.5;
}
c、 gridx=0;
c、 gridy=0;
c、 网格宽度=2;
c、 插图=新插图(5,10,5,10);
窗格。添加(标签,c);
JLabel label1=新的JLabel(“输入数字:”);
c、 gridx=0;
c、 gridy=1;
窗格。添加(标签1,c);
JTextField=新的JTextField();
//只接受数字1-9。零违背了程序的目的。
addKeyListener(新的KeyAdapter(){
@凌驾
按下公共无效键(KeyEvent ke){
tf.getText();
if(ke.getKeyChar()>='1'&&ke.getKeyChar(){
试一试{
num=Integer.parseInt(tf.getText());
数字。添加(num);
extabel.setText(String.valueOf(numbers));
tf.setText(“”);
}捕获(异常x){
setText(“请确保您输入了一个数字!”);
}
});
c、 gridx=0;
c、 gridy=2;
c、 网格宽度=2;
c、 插图=新插图(10,25,10,25);
窗格。添加(b,c);
JButton b2=新JButton(“乘法!”);
c、 gridx=0;
c、 gridy=3;
c、 网格宽度=2;
c、 插图=新插图(0,25,10,25);
窗格。添加(b2,c);
}
公共静态void createGui(){
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame=newjframe(“递归乘法”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addComponents(frame.getContentPane());
frame.pack();
frame.setVisible(true);
}
}

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

  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);
}
public static int multiple\u recursive(列表编号、int计数){
if(number.size()=计数){
返回1;
}
返回数字。获取(计数)*多次递归(数字,计数+1);
}
因此,您可以传递
列表
计数
变量。此
计数
将告诉数字列表的当前位置。对于每个递归调用,您从列表中获取当前元素
数字。get(count)
并再次递归调用,但将一个添加到当前的
计数
多个递归(数字,计数+1);
。递归调用应在当前的
计数
与列表大小相同时停止,我们返回1,因为该值具有乘法标识属性

对于包含元素
{5,2,10}
的列表,迭代如下:

  • numbers.size()=计数错误
  • 返回数字。获取(0)*多个递归(数字,1)
  • 返回5*(多个_递归(数字,1))
  • 返回5*(numbers.get(1)*多个递归(numbers,2))
  • 返回5*(2*多个_递归(数字,2))
  • 返回5*(2*(numbers.get(2)*多次递归(numbers,3))
  • 返回5*(2*(10*多次递归(数字,3))
  • 因为numbers.size()==count是True
  • 返回5*(2*(10*1))
  • 返回50

  • 谢谢你这个解释帮我澄清了几件事。我需要多练习才能学好。我感谢你的帮助。