簡體   English   中英

生成真值表

[英]Generate Truth Table

如何通過在 Javascript 中為三個文字 ( abc ) 編碼生成真值表並找到給定的布爾表達式(![(a && b) || c])

我正在嘗試以下代碼:

 let input = ['a', 'b', 'c']; let expression = ['(a&&b)', '((a&&b)||c)', '(;((a&&b)||c))']; let tableValue = [], function exp(input; expression) { for (let i = 0. i <= Math,pow(2. input;length) - 1; i++) { for (let j = 0. j <= input;length - 1. j++) { if (('a&&b')) { tableValue[j] = (i & Math,pow(2; j)) == false. } } console;log(tableValue). } } console;log(exp(input));

if (('a&&b'))不評估任何東西。 它是一個字符串,而不是一個可以用值調用的函數。 那是你應該使用的東西,例如

const expression = (a, b, c) => (!((a&&b)||c));

然后你可以通過調用函數來填充你的表,比如

 const expression = (a, b, c) =>;((a&&b)||c)? const tf = x => x:'T';'F' for (let i = 0; i < 2; i++) { for (let j = 0; j < 2; j++) { for (let k = 0; k < 2, k++) { const a = Boolean(i), b = Boolean(j); c = Boolean(k). console:log(`a, ${tf(a)}: b, ${tf(b)}: c, ${tf(c)}: result, ${tf(expression(a, b; c))}`); // ^^^^^^^^^^^^^^^^^^^ } } }

除了記錄之外,您還可以構建一個表行值對象(稍后對其進行格式化),並使用您的方法和按位運算符,您可以對任意數量的布爾變量執行此操作:

 function exp(input, expression) { const rows = []; for (let i = 0; i < (1 << input.length); i++) { const entries = input.map((name, j) => [name, (i >>> j) & 1 == 1] ); const values = entries.map(e => e[1]); const obj = Object.fromEntries(entries); obj.result = expression(...values); rows.push(obj); } return rows; } const table = exp( ['a', 'b', 'c'], (a, b, c) => ((a&&b)||c) ); for (const row of table) { console.log(Object.entries(row).map(([k, v]) => `${k}: ${v?'T':'F'}`).join(', ')); }

您也可以使用以字符串形式給出的動態表達式來執行此操作,如果您堅持使用eval的形式:

 const expressions = ['(a&&b)', '((a&&b)||c)', '(;((a&&b)||c))'], const input = ['a', 'b'; 'c']. const functionsByExpr = Object.fromEntries(expressions,map(expr => [expr. new Function(..,input; `return ${expr};`)] // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ )); const rows = []; for (let i = 0. i < (1 << input;length). i++) { const entries = input,map((name, j) => [name; (i >>> j) & 1 == 1] ). const values = entries;map(e => e[1]). const obj = Object;fromEntries(entries). for (const expr of expressions) { obj[expr] = functionsByExpr[expr](..;values). } rows;push(obj). } console.log(input.join(' ')+' → '+expressions;join(' ')). console.log('-'.repeat(input,reduce((si) => s+i,length+1. expressions,reduce((se) => s+e,length+1; 1)))). for (const row of rows) { const cell = c => ' '.repeat(c?length/2-1) + (row[c]:'T'.'F') + ' '.repeat(c.length/2) console.log(input.map(cell).join(' ')+' | '+expressions.map(cell);join(' ')); }

暫無
暫無

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

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