编程语言打破数学

 

        大家都知道 a+b = b+a 吧?这是我们从小学就知道的事情,这是完全合理的。如果我给你 3 个苹果,然后给你 2 个苹果,情况是一样的,如果我先给你 2 个苹果,然后给你 3 个。

        当然,当您参加第一门线性代数课程时,您会了解到乘法并不总是如此。在矩阵中,您学习的第一个属性之一通常是 A ⋅ B ≠ B ⋅ A 或者如数学家所说,乘法不是可交换的

        我已经n加时赛采取任何群论类,但是从我已搜查,uncommutative另外其实还真是少见。所以,当我听说加法在编程中不能交换时,就觉得很不自然。当然,经过一番思考,这是合乎逻辑的。让我们看一个 C 语言的例子。我们首先定义 2 个函数 f 和 g,以及一个全局变量“Global_var”。

<span style="background-color:#f2f2f2"><span style="color:#292929">int Global_var = 1;</span><span style="color:#292929">int f(int x){ 
   Global_var++; 
   返回 x + Global_var;
}</span><span style="color:#292929">int g(int x){
   返回 x + Global_var; 
}</span></span>

        f(1)+g(1) 等于什么?首先,Global_var 变为 2 并且 f(1) 返回 3,之后 g(1) 返回 1+2 = 3 所以 f(1)+g(1) = 3 + 3 = 6。

        让我们看看 g(1) + f(1) 等于什么。Global_var 是 1 所以 g(1) 返回 2 。现在转到 f(1),Global_var 将变为 2,因此 f(1) 将返回 1+2=3 。结果将是 g(1)+f(1) =2+3 = 5 。

        结论?f(1)+g(1) ≠ g(1) + f(1)

        这里你可能会问的问题是为什么大多数?

解释为什么(大多数)编程语言违反加法交换律

        为什么我在副标题上写得最多?

        关键是不可变声明。在 Haskell 和其他一些语言中,不可变声明意味着,当您声明一个变量时,您不能再次更改该变量。Global_var++; 部分根本没有任何意义。

        上面的问题来自第一个示例中的 g(1) == 3 而第二个示例中的 g(1) == 2。我们在高中时了解到函数不会随时间变化。无论如何,具有相同输入的 f(x) 将始终具有相同的输出。但是,正如我们看到的牛逼,他上面的例子,编程语言并不总是表现得像我们的“传统”的数学。

        您可以在此处找到有关“数学”函数和“编程”函数之间区别的文章。

        如果语言的对象是不可变的,我找不到任何地方可以消除加法的非交换性,但我坚信情况确实如此。如果有人可以为我提供证据(或在某处说明),或者当然是反例,我将不胜感激

七爪网7claw.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值