Julia代码运行提示缺少end,请问缺失的end应添加在什么位置?
问题排查与代码修正
直接报错原因
你遇到的语法报错的直接诱因是第6行的多余右括号:
j = buff[1][2]] #column
这里buff[1][2]后面多写了一个],导致Julia解析器语法判断混乱,误判为前面的if语句没有闭合。
其他隐藏语法&逻辑问题
除了上述直接错误,你代码里还有多处不符合Julia语法或者逻辑错误的地方,统一修正如下:
- 空容器判断:
size(buff) == 0改为isempty(buff),size()返回的是维度元组,和整数0直接比较永远为假,会导致递归无法终止 - 晶格边长获取:
L = size(spins[1:1,:])改为L = size(spins, 1),你需要获取的是二维自旋矩阵的行数作为周期边界的边长,原写法得到的是(1, L)的元组,后续和坐标i、j对比会报错 - 周期边界逻辑:
j == L时r = 0改为r = 1,Julia索引从1开始,0会导致索引越界 - 成员判断语法:
site not in clust改为!(site in clust),Julia不支持not in语法 - 原地修改函数:
push(clust,site)和push(buff,site)改为push!(clust, site)、push!(buff, site),Julia中修改原对象的函数默认以感叹号结尾 - 二维数组索引:
spins[site]改为spins[site[1], site[2]],Julia原生二维数组不支持直接传入坐标元组做索引
修正后完整代码
function spin_add(buff, clust, spins, padd) if isempty(buff) return clust else i = buff[1][1] # row j = buff[1][2] # column L = size(spins, 1) u = i-1 d = i+1 r = j+1 l = j-1 if i == L d = 1 end if i == 1 u = L end if j == L r = 1 end if j == 1 l = L end nei = [(u,j), (d,j), (i,r), (i,l)] popfirst!(buff) for site in nei if !(site in clust) if spins[site[1], site[2]] == spins[i,j] if rand() < padd push!(clust, site) push!(buff, site) end end end end return spin_add(buff, clust, spins, padd) end end
内容的提问来源于stack exchange,提问作者newtothis
相关产品推荐
相关产品推荐

