2013-10-01 180 views
0

所有,紅寶石整數分配 - 適應紅寶石分配到C型語言

我試圖去適應一些Ruby代碼在C#中工作,但C#不提供相同的可分配的語法像Ruby

這裏我試圖Ruby代碼適應:

x, x1 = x1, x-q*x1 
    y, y1 = y1, y-q*y1 
    a, b = b, a-q*b 

所以,我把它和這樣做,但我比上面得到不同的結果:

x = x1 
    x1 = x-q*x1 
    y = y1 
    y1 = y-q*y1 
    a = b 
    b = a-q*b 

Ruby如何評估任務?爲什麼當我將多個任務分解爲單獨的任務時,結果是不同的?

+0

您需要使用一些臨時變量。 – iamnotmaynard

+0

請詳細說明。爲什麼需要臨時變量?謝謝 – Slinky

+0

你能舉一個有效的例子嗎?要查看不同的結果? C#中的變量是什麼類型? – EkoostikMartin

回答

2

Ruby首先評估RHS上的每個表達式,然後將它們分配給重要的LHS變量。

這裏的(基本上)紅寶石如何評估第三行a, b = b, a-q*b

temp1 = b 
temp2 = a-q*b 
a = temp1 
b = temp2 

a = 5b = 7一個例子,q = 10

a, b = (7), (5 - 10*7) 

產生

a == 7 
b == -65 

正如你可以看到,不值ab在使用它的RHS表達式被評估之前從其初始值改變。

對比度與正在發生的事情在你的C#代碼:使用與上述相同的值

a = b  // a is changed BEFORE evaluating the value 
      // that will be put into b 
b = a-q*b // The value of a has already been changed: 
      // this is now the same as b = b-q*b, which is not intended 

示例結果:

a == 7 
b == 7 - 10*7 == -63 // Not what we want... 

爲了得到正確的結果,使用具有溫度多線任務變量在這個答案的頂部:

temp1 = b  // 7 
temp2 = a-q*b // 5 - 10*7 == -65 
a = temp1  // 7 
b = temp2  // -65 
0

x, x1 = x1, x-q*x1意味着x和x1都將基本同時分配,但是您的C#變體不會考慮這一點。在你的C#代碼中,x將在x1之前分配,因此x1將被賦值爲x1-q*x1而不是x-q*x1,因爲此時x已經被賦值爲x1。

一種可能的和通用的C#的解決方案是

tempX = x1 
tempX1 = x-q*x1 
x = tempX 
x1 = tempX1 
1

紅寶石評估分配的右側重新分配變量之前。爲了使這更加明確,它是做這樣的事情:

new_x, new_x1 = old_x1, old_x-q*old_x1 

這導致:

new_x = old_x1 
new_x1 = old_x-q*old_x1 

但你正在做的是這樣的:

new_x = old_x1 
new_x1 = new_x-q*old_x1 (= old_x1 - q * old_x1 = (1 - q) * old_x1) 

因此,結果是不同。

0

問題是,在轉讓

x, x1 = x1, x-q*x1 

紅寶石執行任一指配的以前的計算結果在右手側兩者表達式。但是,如果你寫

x = x1 
x1 = x-q*x1 

則因爲第一個語句修改的x價值,表達x-q*x1的價值也發生了變化。

你需要使用一個臨時變量,這樣

newx = x1 
x1 = x-q*x1 
x = newx 

避免太早評估表達的影響。