2012-04-21 9 views
0

オンラインで質問が見つかりました:入力サイズが指定されていれば、よく形成された数字を印刷するための再帰コードの基本ケース

:サイズ= 3つの 番号:123、234、125等の条件は、数がABCその後< B < C私はこのために再帰コードを記述しようとしてい

て以来であると言います私は再帰で吸うベースケースを把握することができない、または再帰から出る方法。

  1. 私は、指定されたサイズの最小の整形番号から始まります(配列にはfor loopと入力してください)。サイズ= 3と言うと、私は123で始まります。その後、私はarr[0] == (10 - size))まで進みます。これは、指定されたサイズのための最大値がarr[0]であることを示しています。

My機能は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); 
    } 
+2

あなたが立ち往生したときに、ここでコードを投稿してみてはいかがですか? – DNA

+0

@DNA:私が書いたコードを示しました。問題は '789 'に達した後で止まらないということです。どのように「中断するか」を理解することはできません。 – noMAD

答えて

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] 
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); 
    } 
} 

マインド、これは宿題であれば完了していません。

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"] 
+0

これは素晴らしいです..ありがとう:) – noMAD