我有以下测试代码......
def extract(node):
if isinstance(node, tuple):
return extract(node[1])
if isinstance(node, list):
result = []
for item in node:
for sublist in extract(item):
for elem in sublist:
result.append(elem)
return result
return node
有关导致错误的原因的任何线索?我知道,如果我发表以下评论......
import Foundation
var n = 5
let binSlots = 64
var numOfOnes = 0
var inSequence = false
func toThePower(number: Int, power: Int) -> Int {
var ans = number
for _ in 1..<power {
ans = ans * number
}
return ans
}
// the following line is fine
if n <= toThePower(number: 2, power: 4) {
print("ok")
}
for i in stride(from: binSlots, through: 0, by: -1) {
// the following line produces this error:
// // error: Execution was interrupted, reason:
// EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
let pCalc = toThePower(number: 2, power: i)
if n >= pCalc {
n = n - pCalc
numOfOnes += 1
inSequence = true
}
else {
if inSequence {
break
}
}
}
错误消失然而我不知道为什么或为什么第一次调用函数运行没有错误。
我看了其他类似的帖子,但没有一个与我的情况类似。
感谢您的帮助。
谢谢。答案 0 :(得分:1)
您的错误来自toThePower
函数中的此行:
for _ in 1..<power {
问题是范围的右侧不能小于范围的左侧。
该行:
for i in stride(from: binSlots, through: 0, by: -1) {
会导致您调用toThePower
功能,其功率降至0并包括0。
0小于1,因此崩溃。
变化:
for i in stride(from: binSlots, through: 0, by: -1) {
为:
for i in stride(from: binSlots, through: 1, by: -1) {
避免崩溃。