b=fun(a) 函数fun把a变成b,每次任意选择下面三种方式之一: 1:b=a*2 2:b=a-1 3:b=a+1

本文探讨了一种变换序列算法,旨在找到从初始值到目标值的最短路径,通过乘以2、加1或减1的操作。文章详细展示了如何使用递归方法解决此问题,并提供了具体的例子,如从43变换到103的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 有个朋友问我这么一个算法题该怎么做,我就自己写了一个

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值