0

オンラインで質問を見つけました。入力サイズを指定すると、そのサイズの整形式の数値がすべて印刷されます。

:サイズ= 3数値:123、234、125など。条件、たとえば数値がabcの場合、a <b <c

私はこのための再帰コードを書き込もうとしていますが、再帰を吸うので、基本ケース、または再帰から抜け出す方法を理解できません。私は1つのアイデアを持っていました:

  1. 私は与えられたサイズの最も小さい整形式の数から始めます(配列をで埋めるだけfor loopです)。サイズ=3と言うと、から始め123ます。次に、指定されたサイズarr[0] == (10 - size))の最大値がarr[0]整形式の数値になるまで続けます。

私の機能はprintNumbers(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);
    }
4

3 に答える 3

1
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]
于 2012-04-22T11:55:40.527 に答える
1

Javaである必要がありますか?これは Haskell の 5 行のソリューションです。これ (および他の 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"]
于 2012-04-22T15:18:06.323 に答える
0

あなたの明確な説明を見て、問題の概念がないというよりはブロックがあると思います。そんな典型的な「宿題」に、とりあえず答えてみます。

public void giveWellFormedNumbers(int inputSize) {
    int[] digits = new int[intputSize];
    giveWFNumbers(digits, 0, 1);
}

/**
 * @param fromIndex the numbers of digits done, the starting index to continue.
 */
private giveWFNumbers(int[] digits, int fromIndex, int fromDigitValue) {
    if (fromIndex >= digits.length) {
        System.out.println(Arrays.toString(digits));
        return;
    }

    // Do one digit yourself, at digits[fromIndex]:

    int maxDigit = 10 - digits.length; // What is the maximal digit you have to do?
    for (int digitValue = fromDigitValue; digitValue <= maxDigit; ++digitValue) {
        digits[fromIndex = digitValue;
        giveFWNumbers(digits, fromIndex + 1, digitValue + 1);
    }
}

これが宿題ならまだ終わっていません。

于 2012-04-21T19:57:17.683 に答える