簡體   English   中英

Java 次遞歸調用

[英]Java recursive calls

我想在 0 和 1 的任何序列上構建一個 go 的代碼,並計算它可以通過在“1”之間“跳躍”的數字傳遞多少種不同的方式。 並且每次跳轉不超過 3 位數。

例如,數字 100110101 可能是:1xx1xx1x1 或 1xx11x1x1(通過所有“1”)。

另一個例子可能是 1011011101:1x11x111x1(通過全“1”)或 1xx1x111x1 或 1x1xx1x1x1 等等......

重要的是不要跳超過 3 位數。 數字也始終以 1 開頭和結尾。

我有以下代碼,我認為它正在運行。

public int calculate(String number){

        if(number.length()<3){ //left fill with 0 
            if(number.length()==2) number = "0" + number;
            else number = "00" + number;
        }

        if(number.length() == 3){ //for 001, 101, 011, 111
            if (number.equalsIgnoreCase("111")) return 2; //2 possible ways
            else return 1; //any other combination will have just one way
        }

        String aux = number.substring(1,4);//take the 3 next digits
        
        //recursive calls to calculate it
        if (aux.equalsIgnoreCase("001")) return calculate(number.substring(3, number.length()));
        else if (aux.equalsIgnoreCase("010")) return calculate(number.substring(2, number.length()));
        else if (aux.equalsIgnoreCase("011")) return calculate(number.substring(2, number.length())) + calculate(number.substring(3, number.length()));
        else if (aux.equalsIgnoreCase("100")) return calculate(number.substring(1, number.length()));
        else if (aux.equalsIgnoreCase("101")) return calculate(number.substring(1, number.length())) + calculate(number.substring(3, number.length()));
        else if (aux.equalsIgnoreCase("110")) return calculate(number.substring(1, number.length())) + calculate(number.substring(2, number.length()));
        else if (aux.equalsIgnoreCase("111")) return calculate(number.substring(1, number.length())) + calculate(number.substring(2, number.length())) + calculate(number.substring(3, number.length()));

        return 0;
    }

問題是:我還想確保不允許連續兩次跳3位數字。 像 1xx1xx1 這樣的東西是不允許的。 但是,由於我使用的是遞歸調用,所以我不知道這是否可行。

防止連續兩次跳轉 3 位的一種方法是將額外的 state 信息傳遞給calculate() 您傳遞的額外數據將是 boolean,指示最后一次跳躍的長度是否為 3。然后在您對calculate()的初始調用中,只需確保指示最后一次跳躍的長度不是 3(因此第一次跳躍允許長度為 3)。

private static int countPossibilities(String inputString) {
            final char validChar = '1';
            final char maxDistance = 3; // max consecutive jumps. eg: maxDistance for '1xxx1' is 3.

            if (inputString.length() == 1) {
                return 1;
            }
            var indexForMaxPossibleJump = Math.min(maxDistance + 1, inputString.length() - 1);
            if (inputString.charAt(indexForMaxPossibleJump) != validChar) {
                indexForMaxPossibleJump = inputString.substring(0, indexForMaxPossibleJump).lastIndexOf(validChar);
            }

            // No jumps possible.
            if (indexForMaxPossibleJump == 0) {
                return 0;
            }

            int finalCount = 0;
            var remainingString = inputString.substring(indexForMaxPossibleJump);
            var maxJumpingString = inputString.substring(1, indexForMaxPossibleJump);

            // calculate count if we are not jumping to max distance. i.e., taking intermediate step on 1.
            for (var i = 0; i < maxJumpingString.length(); i++) {
                if (maxJumpingString.charAt(i) != validChar) {
                    continue;
                }
                var countOfString = countPossibilities(maxJumpingString.substring(i) + remainingString);
                finalCount += countOfString;
            }

            // calculate count if we are jumping to max distance.
            var countOfRemainingString = countPossibilities(remainingString);
            finalCount += countOfRemainingString;
            return finalCount;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM