私はこの算術式の問題を解決しようとしています ここでは、配列内のn個(ここでは5個)の要素をとり、式が101で割り切れるかどうかを調べるために(+ - *)の演算子のすべての組み合わせを試します。 BODMAS 入力この再帰バックトラックソリューションは、算術式を解くためにどのように機能しますか?
出力
55 + 3-45 * 33から25
を使用operators..notの順序に関係ありません私は再帰とバックトラック時に新しいです。私はここに私のコードだ
間違っている問題のどの部分を理解しようとしています: ここ
public static boolean solve(char []operators,long[]nums,long res,int index,Stack<Character>st){
if(index+1==nums.length){ //reached end of number array
if(res%101==0){
System.out.println(res);
return true;
}
return false;
}
for(int i=0;i<operators.length;i++){
char op=operators[i]; //try the operator
long num1=nums[index];
long num2=nums[index+1]; //LINE1
System.out.println("trying "+num1+""+op+" num2="+num2);
res=performOp(op,num1,num2);
nums[index+1]=res;
st.push(op);
if(solve(operators,nums,res,index+1,st)){
return true;
}
//backtrack
//return to earlier state than try another operator
//LINE2
nums[index+1]=performBackTrack(op,num1,num2); //restoring number
System.out.println("num2="+num2+" num1="+num1+" after backtrack");
st.pop();
}
return false;
}
public static long performBackTrack(char op,long num1,long num2){
//trying to restore numbers
switch(op){
case '+':return num2-num1;
case '-':return num1-num2;
case '*':return num1/num2;
default:return 0L;
}
}
public static long performOp(char op,long num1,long num2){
switch(op){
case '+':return num1+num2;
case '-':return num1-num2;
case '*':return num1*num2;
default:return 0L;
}
}
、私はLINE2に変更を加えて、次の作業をしようとするループ内に行くとき、変更の作品をバックトラックした後、私はLINE2で信号番号を取り戻すが、それはLINE1に反映されていないので、LINE1に反映されていないオペレータを試す前に復元しようとする最後の番号。ヘルプの
くださいhelp..Anyの種類は、あなたがあなたのバックトラッキング方法のバグを持っている...
例外がある場合は、それも投稿してください。 –
こんにちは、私は例外を取得していない、完全に偽の結果のみ。 – Learner