有个朋友问我这么一个算法题该怎么做,我就自己写了一个
b=fun(a)
函数fun把a变换到b,每次任意选择下面三种方式之一:
1:b=a * 2
2:b=a - 1
3:b=a + 1
写一个算法,用最少的fun调用次数,来实现变换,并且输出变换序列
trans(2, 5)
第一次变换
4= 2 * 2
第二次变换
5= 4 + 1
然后就搞定了
***************************************************
请测试trans(43, 103)
输出结果:
43 103
need 10 steps
step 1 : 43 -> 44
step 2 : 44 -> 45
step 3 : 45 -> 46
step 4 : 46 -> 47
step 5 : 47 -> 48
step 6 : 48 -> 49
step 7 : 49 -> 50
step 8 : 50 -> 51
step 9 : 51 -> 102
step 10 : 102 -> 103
import java.util.ArrayList;
import java.util.List;
public class Test {
public static final List<String> LIST = new ArrayList<>();
public static void main(String[] args) {
trans(43, 103);
for (int i = LIST.size() - 1; i >= 0; i--) {
System.out.println(LIST.get(i));
}
}
/**
* b=fun(a)
* 函数fun把a变成b,每次任意选择下面三种方式之一:
* 1:b=a*2
* 2:b=a-1
* 3:b=a+1
*
* example:
*
* trans(2,5)
* 第一次变换
* 4=2*2
* 第二次变换
* 5=4+1
*
* @Description: 输出将a转换为b的最优计算步骤
* @param: a
* @param: b
*/
public static void trans(int a, int b) {
if (a == b) {
return;
}
if (a > b) {
LIST.add(a-1 + "=" + a + "-1");
trans(a-1, b);
}
if (a < b) {
if (b % 2 == 0) { // b是偶数
if (b / 2 >= a) {
LIST.add(b + "=" + b/2 + "×2");
trans(a, b/2);
}else {
LIST.add(b + "=" + (b-1) + "+1");
trans(a, b-1);
}
}else {
LIST.add(b + "=" + (b-1) + "+1");
trans(a, b-1);
}
}
}
}
控制台打印如下
44=43+1
45=44+1
46=45+1
47=46+1
48=47+1
49=48+1
50=49+1
51=50+1
102=51×2
103=102+1