Java 递归码的基例打印格式良好的数字

Java 递归码的基例打印格式良好的数字,java,algorithm,Java,Algorithm,我在网上发现了一个问题:给定输入大小,打印出该大小的所有格式正确的数字。 示例:大小=3 数字:123、234、125等条件,假设数字是abc然后a

我在网上发现了一个问题:给定输入大小,打印出该大小的所有格式正确的数字。

示例:大小=3 数字:123、234、125等条件,假设数字是abc然后a 我正试图为此编写一个递归代码,由于我对递归的理解很差,所以我无法理解基本情况,或者如何从递归中走出来。我有一个想法:

  • 我从给定大小的最小格式良好的数字开始(只需用循环的
    填充数组即可)。假设size=3,我从
    123
    开始。然后我继续,直到
    arr[0]==(10-size))
    因为这是给定大小的
    arr[0]
    的最大值,是一个格式良好的数字 我的函数是
    printNumber(int-arr[],int-size)

    但我不确定这是否有效。需要一些指向正确方向的指针

    public void findNumbers(int arr[], int size, int pos)
        {
            if(arr[0] == (10 - size))
                return;
            if(arr[pos] == (10 - size + pos))
            {
                pos--;
                findNumbers(arr,size,pos);
            }
            System.out.println(Arrays.toString(arr));
            arr[pos] = arr[pos] + 1;
            findNumbers(arr,size,pos);
        }
    
        public static void main(String[] args)
        {
            int size = 3;
            int pos = size-1;
            int arr[] = new int[size];
            for(int i = 0; i<size; i++)
            {
                arr[i] = i+1;
            }
            //System.out.println(Arrays.toString(arr));
            WellFormed obj = new WellFormed();
            obj.findNumbers(arr, size, pos);
        }
    
    public void findNumbers(int arr[],int size,int pos)
    {
    如果(arr[0]==(10-大小))
    返回;
    如果(arr[pos]==(10-尺寸+pos))
    {
    pos--;
    FindNumber(arr、尺寸、位置);
    }
    System.out.println(Arrays.toString(arr));
    arr[pos]=arr[pos]+1;
    FindNumber(arr、尺寸、位置);
    }
    公共静态void main(字符串[]args)
    {
    int size=3;
    int pos=尺寸-1;
    int arr[]=新的int[size];
    
    对于(inti=0;i我认为你对这个问题的理解比没有概念要复杂得多,因为看到了你清晰的描述。所以,这一次我回答了这样典型的“家庭作业”

    public void giveWellFormedNumbers(int-inputSize){
    int[]位=新的int[intputSize];
    给定的数字(数字,0,1);
    }
    /**
    *@param fromIndex完成的位数,继续的起始索引。
    */
    私有数字(int[]位,int fromIndex,int fromDigitValue){
    if(fromIndex>=位数.length){
    System.out.println(数组.toString(数字));
    返回;
    }
    //在数字[fromIndex]处自己做一个数字:
    int maxDigit=10-digits.length;//必须执行的最大数字是什么?
    
    对于(int digitValue=fromDigitValue;digitValue它必须是Java吗?这里是Haskell五行代码中的一个解决方案。我喜欢这个(以及其他Haskell代码)的地方是它基本上读起来像是问题的定义

    wellFormed::Int->[a]->[[a]]
    wellFormed _ [] = []
    wellFormed 1 xs = map (\x -> [x]) xs
    wellFormed n (x:xs) = helper n x xs ++ wellFormed n xs
      where helper n init rest = map ((:) init) (wellFormed (n - 1) rest)
    
    > wellFormed 3 "123456789"
    ["123","124","125","126","127","128","129","134","135","136","137","138","139","145","146","147","148","149","156","157","158","159","167","168","169","178","179","189","234","235","236","237","238","239","245","246","247","248","249","256","257","258","259","267","268","269","278","279","289","345","346","347","348","349","356","357","358","359","367","368","369","378","379","389","456","457","458","459","467","468","469","478","479","489","567","568","569","578","579","589","678","679","689","789"]
    

    为什么不试试看,当你卡住的时候,把你的代码贴在这里?@DNA:我已经展示了我写的代码。问题是它在到达
    789
    后并没有停止。我不知道如何
    破解。
    
    import java.util.Arrays;
    
    public class WellFormed {
    
        public static int maxDigit;
    
        public void findNumbers(int[] digits, int start, int currPos) {
            if (currPos >= digits.length) {
                System.out.println(Arrays.toString(digits));
                return;
            }
    
            int maxDigitInCurrPos = maxDigit - digits.length + currPos + 1;
            for (int i = start; i <= maxDigitInCurrPos; i++) {
                digits[currPos] = i;
                findNumbers(digits, i+1, currPos + 1);
            }
        }
    
        public static void main(String[] args)
        {   
            WellFormed obj = new WellFormed();
            maxDigit = 5;
            int inputSize = 3;
            int[] digits = new int[inputSize];
            obj.findNumbers(digits, 1, 0);
        }
    }
    
    For inputSize = 3 and maxDigit = 5, output is:
    
    [1, 2, 3]
    [1, 2, 4]
    [1, 2, 5]
    [1, 3, 4]
    [1, 3, 5]
    [1, 4, 5]
    [2, 3, 4]
    [2, 3, 5]
    [2, 4, 5]
    [3, 4, 5]
    
    wellFormed::Int->[a]->[[a]]
    wellFormed _ [] = []
    wellFormed 1 xs = map (\x -> [x]) xs
    wellFormed n (x:xs) = helper n x xs ++ wellFormed n xs
      where helper n init rest = map ((:) init) (wellFormed (n - 1) rest)
    
    > wellFormed 3 "123456789"
    ["123","124","125","126","127","128","129","134","135","136","137","138","139","145","146","147","148","149","156","157","158","159","167","168","169","178","179","189","234","235","236","237","238","239","245","246","247","248","249","256","257","258","259","267","268","269","278","279","289","345","346","347","348","349","356","357","358","359","367","368","369","378","379","389","456","457","458","459","467","468","469","478","479","489","567","568","569","578","579","589","678","679","689","789"]