假设有n个布尔变量x1, ..., xn,输出其所有可能的真值集合
2012-05-21 17:17
183 查看
例如,如果n=2, 有四种可能:<true, true>, <true, false>,<false, true>和<false, false>。编写C语言函数实现之。
分析:对于任意一个正整数n,所有可能的情况为2^n种,即n个2相乘。对于每一个元素,有两种可能:true或者false,我们可以将其中一种结果设定为一个长度为n的序列,在每一位上,它的值只能是true或false。可以用下面给出的简单算法来产生其所有可能的序列,即长度为n的序列由下列序列组成:(True,(n-1)序列所有结果),(False,(n-1)序列所有结果)。由此我们自然想到使用递归,这表明,如果能够解决n-1个元素的序列,就可以解决n个元素的序列。
#include <stdio.h>
#define Max_size 100 /*最多可以使得n=100 */
void value(char *, int i, int n);
void main(void)
{
int n, k;
char list[Max_size]; /*用字符数组存储字符,‘T’代表true, ‘F’代表false*/
printf("input the number of Booleans: \n");
scanf("%d", &n);
if (n<1 || n>Max_size)
{
printf("\nImproper number n!\n");
exit(1);
}
for(k=0; k<n; k++)
{
list[k] = 'T';
}
value(list, 0, n-1);
}
void value (char *list, int i, int n)
{
int j;
if (i==n+1) /*已经递归完毕, 输出序列*/
{
for (j=0; j<=n; j++)
{
printf("%c", list[j]);
}
printf(" ");
}
else {
list[i] = 'T';
value(list, i+1, n);
list[i] = 'F';
value(list, i+1, n);
}
}
分析:对于任意一个正整数n,所有可能的情况为2^n种,即n个2相乘。对于每一个元素,有两种可能:true或者false,我们可以将其中一种结果设定为一个长度为n的序列,在每一位上,它的值只能是true或false。可以用下面给出的简单算法来产生其所有可能的序列,即长度为n的序列由下列序列组成:(True,(n-1)序列所有结果),(False,(n-1)序列所有结果)。由此我们自然想到使用递归,这表明,如果能够解决n-1个元素的序列,就可以解决n个元素的序列。
#include <stdio.h>
#define Max_size 100 /*最多可以使得n=100 */
void value(char *, int i, int n);
void main(void)
{
int n, k;
char list[Max_size]; /*用字符数组存储字符,‘T’代表true, ‘F’代表false*/
printf("input the number of Booleans: \n");
scanf("%d", &n);
if (n<1 || n>Max_size)
{
printf("\nImproper number n!\n");
exit(1);
}
for(k=0; k<n; k++)
{
list[k] = 'T';
}
value(list, 0, n-1);
}
void value (char *list, int i, int n)
{
int j;
if (i==n+1) /*已经递归完毕, 输出序列*/
{
for (j=0; j<=n; j++)
{
printf("%c", list[j]);
}
printf(" ");
}
else {
list[i] = 'T';
value(list, i+1, n);
list[i] = 'F';
value(list, i+1, n);
}
}
相关文章推荐
- 假设有n个布尔变量x1, ..., xn,输出其所有可能的真值集合
- 输入一个整数,输出所有可能的整数序列,使得序列中的整数之和等于输入的整数
- 递归-N个不相同的元素,输出所有可能的排列
- 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。
- 输入一个集合,输出这个集合的所有子集
- 给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合
- 输出一个集合的所有子集,从长到短
- 给定一个集合,输出它的所有子集
- 给定一个字符串,输出其所有的可能排列
- 1-n,从中选择任意两两不同的k个数,输出所有可能的组合,要求不重不漏
- 一道matlab作业题:假设从楼上到楼下有8个台阶,每一步有三种走法:走1个台阶;走2个台阶;走3个台阶,问可以有多少种方案?并将所有方案输出
- 输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 设S是有n个元素的集合,S的幂集是S所有可能的子集组成的集合。
- 网易笔试题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 陈利人 面试题 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。
- 顺序输出从1到N位的所有数字(N可能是一个大数位)。
- 输出集合的所有子集
- 给定入栈顺序,输出所有可能出栈情况及所有情况的总数
- 网易笔试题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 编程题:输出字符集合的所有排列组合。