用PHP输出真值表
我遇到了这个问题,并尝试在PHP中模拟它(我知道源代码是可用的,但我知道0 perl) 现在我的问题不是计算表达式,而是如何输出表,以便显示变量的T和F的每个组合 例如,对于3个变量,该表如下所示:用PHP输出真值表,php,truthtable,Php,Truthtable,我遇到了这个问题,并尝试在PHP中模拟它(我知道源代码是可用的,但我知道0 perl) 现在我的问题不是计算表达式,而是如何输出表,以便显示变量的T和F的每个组合 例如,对于3个变量,该表如下所示: a | b | c ----------- T | T | T T | T | F T | F | T T | F | F F | T | T F | T | F F | F | T F | F | F 有4个变量 a | b | c | d ------------- T |
a | b | c
-----------
T | T | T
T | T | F
T | F | T
T | F | F
F | T | T
F | T | F
F | F | T
F | F | F
有4个变量
a | b | c | d
-------------
T | T | T | T
T | T | T | F
T | T | F | T
T | T | F | F
T | F | T | T
T | F | T | F
T | F | F | T
T | F | F | F
F | T | T | T
F | T | T | F
F | T | F | T
F | T | F | F
F | F | T | T
F | F | T | F
F | F | F | T
F | F | F | F
创建它的逻辑/模式是什么?您可以这样做:
echo "<table>";
for($a=0; $a<=1; $a++){
for($b=0; $b<=1; $b++){
for($c=0; $c<=1; $c++){
for($d=0; $d<=1; $d++){
echo "<tr><td>$a</td><td>$b</td><td>$c</td><td>$d</td></tr>";
}
}
}
}
echo "</table>";
echo”“;
对于($a=0;$a您应该首先计算组合的数量,例如,如果您有4个变量,那么您将有16个组合。对于每个变量,将其索引称为i。在该变量的列中,您将有(n/(2^i))次切换T和F组,其中n是变量可能值的总组合
<?php
$numberOfVariables = 5;
$totalCombinations = pow(2, $numberOfVariables);
for ($i = 0; $i < $numberOfVariables; $i++)
{
$subGroupCount = $totalCombinations / pow(2, $i);
$lettersPerGroup = $totalCombinations / $subGroupCount;
$toggler = true;
for($j=0; $j<$subGroupCount; $j++)
{
for($k=0; $k < $lettersPerGroup; $k++)
$array[$i][$j*$lettersPerGroup + $k] = ($toggler ? "T" : "F");
$toggler = !$toggler;
}
}
echo("<table border='1' bgcolor='yellow'>");
for ($k=0;$k<$totalCombinations;$k++)
{
echo("<tr>");
for ($j=$numberOfVariables-1;$j>=0;$j--)
echo("<td>".$array[$j][$k]."</td>");
echo("</tr>");
}
echo("</table>");
?>
$nbBooleans=5;//随意更改
//显示标题
对于($i=0;$i<$nbBooleans;$i++)
{
如果($i>0)
回声“|”;
echochr($i+65);//1=>A,2=>B等。
}
//分隔线(动态尺寸)
回声“\n”.str_重复(“-”,($nbBooleans-1)*3+nbBooleans)。“\n”;
//显示组合
$nbinteractions=pow(2$nbBooleans);
对于($i=0;$i<$nbinteractions;$i++)
{
对于($iBit=0;$iBit<$nbBooleans;$iBit++)
{
如果($iBit>0)
回声“|”;
回声($i&pow(2,$iBit))!=0?'Y':'N');
}
回音“\n”;
}
为此制作了一个小功能:
function printTruth($vars) {
$rows = array();
$max = pow(2, $vars);
// Lines and Letters
$arr = array();
for($i=97;$i<(97+$vars);$i++) { $arr[] = chr($i); }
$rows[] = implode(' | ', $arr);
$rows[] = str_repeat('-', $vars*3);
// Variables
for($i=0;$i<$max;$i++) {
$oneRow = '';
for ($j=0;$j<$vars;$j++) {
if($j>0)
$oneRow .= " | ";
$oneRow .= (($i & pow(2,$j)) != 0 ? 'T' : 'F');
}
$rows[] = strrev($oneRow);
}
return implode("<br>", $rows);
}
echo printTruth(3);
函数printTruth($vars){
$rows=array();
$max=pow(2$vars);
//行和字母
$arr=array();
对于($i=97;$i这个递归函数怎么样?它返回一个二维数组,其中每个“行”都有$count
元素。您可以使用它生成表
function getTruthValues($count) {
if (1 === $count) {
// true and false for the first variable
return array(array('T'), array('F'));
}
// get 2 copies of the output for 1 less variable
$trues = $falses = getTruthValues(--$count);
for ($i = 0, $total = count($trues); $i < $total; $i++) {
// the true copy gets a T added to each row
array_unshift($trues[$i], 'T');
// and the false copy gets an F
array_unshift($falses[$i], 'F');
}
// combine the T and F copies to give this variable's output
return array_merge($trues, $falses);
}
function toTable(array $rows) {
$return = "<table>\n";
$headers = range('A', chr(64 + count($rows[0])));
$return .= '<tr><th>' . implode('</th><th>', $headers) . "</th></tr>\n";
foreach ($rows as $row) {
$return .= '<tr><td>' . implode('</td><td>', $row) . "</td></tr>\n";
}
return $return . '</table>';
}
echo toTable(getTruthValues(3));
函数值($count){
如果(1==$count){
//第一个变量的true和false
返回数组(数组('T')、数组('F'));
}
//为少1个变量获取2个输出副本
$trues=$falses=getTruthValues(--$count);
对于($i=0,$total=count($trues);$i<$total;$i++){
//真正的副本会在每一行中添加一个T
数组_unshift($trues[$i],'T');
//假拷贝得到F
数组_unshift($false[$i],'F');
}
//组合T和F副本以给出此变量的输出
返回数组\u merge($trues,$false);
}
函数toTable(数组$行){
$return=“\n”;
$headers=范围('A',chr(64+计数($rows[0]));
$return.=''。内爆(''.$headers)。“\n”;
foreach($行作为$行){
$return.=''。内爆(''.$row)。“\n”;
}
返回$return.';
}
echo toTable(值(3));
编辑:,并添加一个函数将数组转换为表。尝试以下代码。generate($numberOfVariables)返回一个包含真值表的数组。每个元素都是一个字符串,您可以迭代
<?
function generate($var=3){
$number= pow(2,$var)-1;
$array=array();
while($number>=0){
$str=decbin($number);
$number--;
while(strlen($str)<$var)
{
$str="0".$str;
}
array_push($array,$str);
}
return $array;
}?>
<pre>
<?print_r(array_reverse(generate(3)));
?>
</pre>
这种方法可能很难看,但似乎很普遍:)
你可以只使用嵌套for循环,每个变量一个?但是这些“truthtable”实际上没有任何意义;它们只是一个t和F的所有可能组合的列表?是的。获得组合让我感到很沮丧。我也在做类似的事情,作为我糟糕答案的替代:)+19个组合,有3个变量,每个变量有两个可能的值???:-/删除最后一个注释…我计算错了。现在我看到了。谢谢!我可以将其转换为PHP。但我试图理解你的解释…这是一个很好的解释,但我还没有完全理解。等等,我想它正在按照你想要的方式工作。你能检查一下吗?希望他能理解lps.Narfs,似乎我应该在发布之前点击F5。速度有点太慢:)至少你现在已经有了一个用于此的函数。越多越好。虽然我不只是试图复制和粘贴,但我也试图深入理解逻辑/概念,代码越多越好:)使用array\u unshift创建更合理的顺序array_push:您好。我花了两个小时(大约7个小时)研究这段代码,因为我一直在努力处理递归函数。虽然我现在理解了代码工作的逻辑和过程,但我的问题是,在您的头脑中,您希望代码遵循的had模式是什么?(如果问题不太清楚,请抱歉)我认为它是从一个变量的T和F开始的,然后第二个变量将获取第一个变量输出的两个副本,一个与它的T值结合,一个与它的F值结合。这对每个变量都是一样的。虽然效率不太高,但工作正常。我将在代码中添加一些注释。
<?
function generate($var=3){
$number= pow(2,$var)-1;
$array=array();
while($number>=0){
$str=decbin($number);
$number--;
while(strlen($str)<$var)
{
$str="0".$str;
}
array_push($array,$str);
}
return $array;
}?>
<pre>
<?print_r(array_reverse(generate(3)));
?>
</pre>
$length = 3;
for($i=0;$i<pow(2,$length);$i++){
$bin = decbin($i);
_add($bin, $length);
_out($bin, $length);
}
function _out($str, $length){
for ($i=0; $i<$length; $i++)
echo ($str[$i] == 0 ? 'F' : 'T')."\t";
echo "\n";
}
function _add(&$bin, $length){
$add = '';
if (strlen($bin) < $length){
for($j=0;$j<($length - strlen($bin));$j++){
$add.='0';
}
$bin = $add.$bin;
}
}
F F F
F F T
F T F
F T T
T F F
T F T
T T F
T T T