实现一个函数,算出有几种括号的放法可使该表达式得出result值

来源:互联网 发布:淘宝美工做图尺寸 编辑:程序博客网 时间:2024/06/06 11:49

        至此,要解决这个问题,只需反复套用这些递归关系即可。(注意:为了避免代码行不必要的回绕,以及确保代码的可读性,下面的代码使用了非常短的变量名。)

public int f(String exp,boolean result,int s,int e)
{
if(s==e)
{
if(exp.charAt(s)=='1' && result)
{
return 1;
}else if(exp.charAt(s)=='0'&& !result)
{
return 1;
}
return 0;
}
int c=0;
if(result)
{
for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op =='&')
c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
else if(op=='|')
{
c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);

}else if(op =='^')
{
c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
}
}
}
else
{
for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op=='&')
{
c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
}else if(op == '|')
{
c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
}
else if(op=='^')
{
c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);

}

}
}
return c;
}


 public int f(String exp,boolean result,int s,int e,HashMap<String,Integer> q)
 {
String key=""+result+s+e;
if(q.containsKey(key))
{
return q.get(key);
}
if(s==e)
{
if(exp.charAt(s)=='1'&&result==true)
{
return 1;
}else if(exp.charAt(s)=='0'&& result==false)
{
return 1;
}
return 0;
}
int c=0;
if(result)
{
for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op =='&')
{
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
}else if(op == '|')
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
}else if(op =='^')
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
}
}
}
else
{
for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op =='&')
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);

}else if(op == '|')
{
c+=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);
}else if(op =='^')
{
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);
}
}
}
q.put(key,c);
return c;
 }


 public int f(String exp,boolean result,int s,int e,HashMap<String,Integer> q)
{
String key=""+result+s+e;
int c=0;
if(!q.containsKey(key))
{
if(s==e)
{
if(exp.charAt(s)=='1') c=1;
else 
c=0;
}

for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op =='&')
{
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
}else if(op == '|')
{
int left_ops=(i-1-s)/2;//括号在左边
int right_ops=(e-i-1)/2;//括号在右边
int total_ways=total(left_ops)*total(right_ops);
int total_false=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);
  c+=total_ways-total_false;
}else if(op =='^')
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
}
}
q.put(key,c);
}
else
{
c=q.get(key);
}
if(result)
{
return c;
}
else
{
int num_ops=(e-s)/2;
return total(num_ops);
}


}


0 0