学校の課題の一部として真理値表を印刷しようとしています。Java で動的サイズの真理値表を生成するにはどうすればよいですか?
したがって、次のようにprintTruthTable(1)
出力されます。
0
1
printTruthTable(3)
プリント:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
等々。再帰を使用して実装しようとしていますが、うまくいきません。
学校の課題の一部として真理値表を印刷しようとしています。Java で動的サイズの真理値表を生成するにはどうすればよいですか?
したがって、次のようにprintTruthTable(1)
出力されます。
0
1
printTruthTable(3)
プリント:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
等々。再帰を使用して実装しようとしていますが、うまくいきません。
これがあなたの問題についての私の見解です。すべてが少人数のクラスで素晴らしくタイトに書かれています。コピー/貼り付けするだけです。
modulo2(%記号)を使用してループインデックスから0と1を取得する方法に注目してください
public class TruthTable {
private static void printTruthTable(int n) {
int rows = (int) Math.pow(2,n);
for (int i=0; i<rows; i++) {
for (int j=n-1; j>=0; j--) {
System.out.print((i/(int) Math.pow(2, j))%2 + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
printTruthTable(3); //enter any natural int
}
}
これは真理値表ではなく、2 進数の表です。Java のInteger.toBinaryString
メソッドを使用して、必要なゼロと 1 を生成できます。スペースの挿入は簡単です。
int n = 3;
for (int i = 0 ; i != (1<<n) ; i++) {
String s = Integer.toBinaryString(i);
while (s.length() != 3) {
s = '0'+s;
}
System.out.println(s);
}
再帰の魔法:
public static void main(String args[]) {
int size = 3;
generateTable(0, size, new int[size]);
}
private static void generateTable(int index, int size, int[] current) {
if(index == size) { // generated a full "solution"
for(int i = 0; i < size; i++) {
System.out.print(current[i] + " ");
}
System.out.println();
} else {
for(int i = 0; i < 2; i++) {
current[index] = i;
generateTable(index + 1, size, current);
}
}
}
生成しているものを見ると、バイナリでカウントしているように見えます。バイナリで 2^(n) - 1 までカウントし、ビットを吐き出します。
真理値表は数値のバイナリ表現に基づいていますが、先頭のゼロを削除していないため、0 から (1<
public void generate(int n){
for (int i=0 ;i!=(1<<n);i++) {
String binaryRep = Integer.toBinaryString(i);
while (s.length() != n) {
binaryRep = '0'+binaryRep;
}
System.out.println(s);
}
}
再帰を使用してそれを行うこともできます:
public void generateRecursively(int i , int n){
if(i==(1<<n))
return;
else{
String temp = Integer.toBinaryString(i);
while(temp.length()<n){
temp = '0'+temp;
}
System.out.println(temp);
generateRecursively(i+1,n);
}
}
あなたの問題をより長く理解する
import java.util.Scanner;
public class tt{
boolean arr[][];
boolean b=false;
boolean[][] printtt(int n){
for(int i=0;i<n;i++){
for(int j=0;j<(Math.pow(2,n));j++){
if(j<Math.pow(2,n-1)){
arr[j][i]=b;
}
else{
arr[j][i]=!b;
}
}
}
return(arr);
}
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
System.out.println("Input values count");
tt ob=new tt();
int num=sc.nextInt();int pownum=(int)Math.pow(2,num);
boolean array[][]=new boolean[pownum][num];
array=ob.printtt(num);
for(int i=0;i<num;i++){
for(int j=0;j<(Math.pow(2,num));j++){
System.out.println(array[j][i]);
}
}
}
}