代码如下:
package sf_04;
public class Main {
/*
* a表示参加运算的元素
* b表示考虑的元素的下标
* so代表结果串
* goal代表计算目标
*/
static void f(int a[],int k,String so,int goal){
/*
* 一共有三种选择:
*/
if(k==0){//到达了第一个数字
if(goal==a[k]){
System.out.println(a[k]+so);
}
return;
}
/*
* 每次将新串加在合成结果的前面。
*/
f(a,k-1,"+"+a[k]+so,goal-a[k]);//目标要减去a[k];
f(a,k-1,"-"+a[k]+so,goal+a[k]);
int old=a[k-1];
/*
* 将两个数字进行合成。
*/
a[k-1]=Integer.parseInt(""+a[k-1]+a[k]);
f(a,k-1,so,goal);
a[k-1]=old;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
* 递归的难点在于怎么设计递归方法的参数。
* 比如对于9来说,9的前面为+,-,或者和8合并。
*/
int a[]={1,2,3,4,5,6,7,8,9};
/*
* a为当前运算的数字
* 8代表数组下标,下标从0开始。
* 如果从1开始时不太方便。
* 空串为累积好的算式。
* 110为计算的目标。
*/
f(a,8,"",110);
}
}
运行结果: