對不起,如果我的英語不好,我會說韓語作為母語。
我嘗試使用下面的偽代碼用 Lua 實作遞回合并排序:
void merge(int h, int m, const keytype U[], const keytype V[], keytype S[]) {
index i, j, k;
i = 1; j = 1; k = 1;
while (i <= h && j <= m) {
if (U[i] < V[j]) {
S[k] = U[i];
i ;
} else {
S[k] = V[j];
j ;
}
k ;
}
if (i > h) {
copy V[j] through V[m] to S[k] through S[h m];
} else {
copy U[i] through U[h] to S[k] through S[h m];
}
}
void mergesort(int n, keytype S[]) {
if (n > 1) {
const int h = ?n/2?, m= n - h;
keytype U[1..h], v[1..m];
copy S[1] through S[h] to U[1] through U[h];
copy S[h 1] through S[n] to V[1] through V[m];
mergesort(h,U);
mergesort(m,V);
merge(h,m,U,V,S);
}
}
我用 Lua 寫道:
function merge(h, m, U, V, S)
print(S[1], S[h m])
i, j, k = 1, 1, 1
while i<=h and j<=m do
if U[i] < V[j] then
S[k] = U[i]
i = i 1
else
S[k] = V[j]
j = j 1
end
k = k 1
end
if i>h then
while j<=m do
S[k] = V[j]
j, k = j 1, k 1
end
else
while i<=h do
S[k] = U[i]
i, k = i 1, k 1
end
end
end
function mergeSort(n, S)
if n>1 then
h = math.floor(n/2)
m = n - h
local U = {}
local V = {}
i = 1
while i<=h do
U[i] = S[i]
i = i 1
end
while i<=n do
V[i-h] = S[i]
i = i 1
end
print(h, m)
mergeSort(h, U)
mergeSort(m, V)
merge(h, m, U, V, S)
end
end
s = {52, 33, 14, 27, 8, 31, 24, 11, 5, 36, 44, 47, 20}
mergeSort(#s, s)
for k, v in ipairs(s) do
print(v)
end
但結果是14, 33, 14, 27, 8, 31, 24, 11, 5, 36, 44, 47, 20,未排序且元素重復。但是,我嘗試將此 Lua 代碼轉換為 python 代碼:
import math
def merge(h, m, U, V, S):
print(S[1], S[h m])
i, j, k = 1, 1, 1
while i<=h and j<=m:
if U[i] < V[j]:
S[k] = U[i]
i = i 1
else:
S[k] = V[j]
j = j 1
k = k 1
if i>h:
while j<=m:
S[k] = V[j]
j, k = j 1, k 1
else:
while i<=h:
S[k] = U[i]
i, k = i 1, k 1
def mergeSort(n, S):
if n>1:
h = math.floor(n/2)
m = n - h
U = {}
V = {}
i = 1
while i<=h:
U[i] = S[i]
i = i 1
while i<=n:
V[i-h] = S[i]
i = i 1
print(h, m)
mergeSort(h, U)
mergeSort(m, V)
merge(h, m, U, V, S)
a = [52, 33, 14, 27, 8, 31, 24, 11, 5, 36, 44, 47, 20]
s = dict(enumerate(a, 1))
mergeSort(len(s), s)
print([s[i] for i in range(1, len(s) 1)])
我認為這與 pythonic 代碼相差甚遠,但無論如何,這段代碼畢竟對序列進行了很好的排序,結果[5, 8, 11, 14, 20, 24, 27, 31, 33, 36, 44, 47, 52]. 所以我發現這個bug和lua表有關,但是通過print()除錯得到的資訊很少,也找不到任何與這個相關的lua參考。我的 lua 代碼會有什么問題?另外,我怎樣才能讓我的python代碼更pythonic?
uj5u.com熱心網友回復:
問題源于您使用全域變數而不是區域變數。函式呼叫將以這種方式改變呼叫“父”函式的值。如果將函式內宣告的所有全域變數本地化,它既可以修復錯誤又可以提高性能。考慮使用 linter 來發現此類全域變數錯誤。
固定代碼:
function merge(h, m, U, V, S)
print(S[1], S[h m])
local i, j, k = 1, 1, 1
while i<=h and j<=m do
if U[i] < V[j] then
S[k] = U[i]
i = i 1
else
S[k] = V[j]
j = j 1
end
k = k 1
end
if i>h then
while j<=m do
S[k] = V[j]
j, k = j 1, k 1
end
else
while i<=h do
S[k] = U[i]
i, k = i 1, k 1
end
end
end
function mergeSort(n, S)
if n>1 then
local h = math.floor(n/2)
local m = n - h
local U = {}
local V = {}
local i = 1
while i<=h do
U[i] = S[i]
i = i 1
end
while i<=n do
V[i-h] = S[i]
i = i 1
end
print(h, m)
mergeSort(h, U)
mergeSort(m, V)
merge(h, m, U, V, S)
end
end
local s = {52, 33, 14, 27, 8, 31, 24, 11, 5, 36, 44, 47, 20}
mergeSort(#s, s)
for k, v in ipairs(s) do
print(v)
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448937.html
上一篇:將遞回函式更改為尾遞回
下一篇:重試機制以從不同主機發送電子郵件
