我查看了不同的响应:主题行上显示的错误。我正在编写一个递归调用的函数。我在变量ctr上得到无限制的局部错误。我使用变量ctr来保持计数。代码如下所示。
void Insert (int key, int value) {
int hash_value = Hash(key);
if (hash_value >= table.size() || hash_value < 0) {
throw std::out_of_range("Cannot insert.");
} else {
Item *item = new Item(key, value); // This will work
// Item item2(key, value); This does not work
if (!table[hash_value]) { // there is not item in this cell
Cell *c = new Cell(0, item); // Cell *c = new Cell(0, &item2)
table[hash_value] = c;
} else { // try next one, if occupied, the one after ...
int index = hash_value + 1;
while (table[index]) {
++index;
if (index == table.size()) {
index = 0;
} else if (index == hash_value) {
throw std::out_of_range("Opps! The table is full! Cannot insert!");
}
}
Cell *c = new Cell(0, item); // Cell *c = new Cell(0, &item2)
table[index] = c;
}
}
答案 0 :(得分:0)
global
可能有用。
ctr = 0 # initialize
def myfn(N):
global ctr
if N == 0:
return ctr
elif N % 10 == 2:
ctr += 1
A = N/10
print A
return myfn(A) # add return here
else:
A = N/10
return myfn(A) # add return here
此代码未经过测试。
答案 1 :(得分:0)
我建议您不要使用ctr
,并且应该递归计算ctr
的值。
def myfn(N):
if N == 0:
return 0
elif N % 10 == 2:
A = N/10
print A
return myfn(A) + 1
else:
A = N/10
return myfn(A)
此代码未经过测试。
答案 2 :(得分:0)
我认为这是在处理递归函数中的变量时的练习/探索。
您可以在递归调用中将ctr
作为参数传递,并且可以使用默认值对其进行初始化,这样您就不需要在原始调用中提供ctr
。
def myfn(N, ctr=0):
if N == 0:
return ctr
elif N % 10 == 2:
ctr += 1
A = N/10
print A
return myfn(A, ctr)
else:
A = N/10
return myfn(A, ctr)
print myfn(1233252672)
<强>输出强>
123325267
123325
1233
1
4
(如果您需要传递更复杂的物体,那么您必须小心。有关详细信息,请参阅“Least Astonishment” in Python: The Mutable Default Argument。
但是,只使用while
循环来完成此任务更简单。递归在Python中效率不高,因此您只应在适合问题域时使用它,例如使用递归数据结构(如树)。
def myfn(n):
ctr = 0
while n:
a = n // 10
if n % 10 == 2:
ctr += 1
print a
n = a
return ctr