不增加变量,不使用数组对象,实现一句话交换数值(JS)

a=(b^=(a^=b))^a  //按位方式

a=(b*=(a/=b))/a    //乘除方式

a=(b+=(a-=b))-a   //加减方式

周六闲来无事,复习了一下以前知识,偶然发现训练营笔记居然还没看。看到不增加变量交换数值的方法,除了数组a=[b=a,b][1]的方式,其他运算都需要进行三次才可以换值。于是我稍微研究了一下,发现JS会返回赋值运算的值,所以三句话其实可以囊括到一句里。

关于思考的整个过程,既抽象又形象,我简单形容一下。当时惊奇于a^=b,b^=a,a^=b的方式居然能实现数值转换,一个按位计算赋值语句使用了两次,我去!这么牛?

然后我仔细思考了其中逻辑,对比a+=b,b=a-b,a-=b的方式,以及自己衍生出来的a-=b,b+=a,a=b-a;;;;;;;;;a*=b,b=a/b,a/=b;;;;;;;;;;;a/=b,b*=a,a=b/a;;;;;;;;;;发现最主要还是生成了一个“反算值”,这个“反算值”是我乱取得名字,别在意(我也不太喜欢这个名字,更喜欢叫它“三模值”,原因之后再解释)。

这个“反算值”就是a进行第一次运算时取得的一个分离于原先a和b的值,它可以是加减乘除按位中的任意一个通过运算取得的值。之所以叫“反算值”是因为它可以通过之前使用的运算方式的反方法转化为原先的值,我举个例子:56=7*8,假设原先只有a,b两值分别为7和8,那么56就是它们的“反算值”,当然15=7+8中的15也是它们的“反算值”;“反算值”可以暂时接替它们中的任意值,就让a=“反算值(56)”,那么要取得原先a的值,可以使用“反算值(56)”/b(8)=7。此时因为“反算值”可以根据原先的一个值得到原先的另一个值,所以可以使用赋值进行转换操作了b=“反算值(56)”/b(8),此时b=7,那么a=“反算值(56)”/b(7),a=8,转换成功。读者可以使用DNA转录方法来考虑这个逻辑

以上思路及其抽象,难以记忆。于是我使用了形象的方式记住了这个方法,在这个方法中它不叫“反算值”,它叫“三模值”。

假设有两个模型▲和◼。这两个模型可以通过许多特定方式转换成第三个模型⬤,我将这一过程统一叫做▲◼=>⬤。这三个模型之间,任意两个都可以转换成另外的第三个,可以是▲⬤=>◼,也可以是⬤◼=>▲等等。那么是否意味着只要有两个模型,就能确定第三个缺失的模型。

我用“三模值”的方式概括一下最上方那三个表达式。拿a=(b^=(a^=b))^a举例。

先假设a=▲,b=◼,首先替换最里层的a和b;

a=(b^=(a^=b))^a转换为a=(b^=(a=▲^◼))^a,最里层a执行赋值后,a=⬤,b=◼;

继续转换a=(b^=⬤)^a,按位等于转换成一般格式,并转换括号内等式右侧的,a=(b=◼^⬤)^a,b执行赋值后,a=⬤,b=▲;

继续转换a=▲^a,转换等式右侧的,a=▲^⬤,此时a=◼,b=▲,完成换值。

另外两个方式同理。观察发现,任何赋值步骤结束时a和b都是不同的模型,意味着整个计算过程三个模型都能同时表达出来。

具体的原理参照“反算值”说法,容易记忆的模型参照“三模值”转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值