无限制的本地错误

时间:2015-09-26 13:59:14

标签: python python-2.7

我查看了不同的响应:主题行上显示的错误。我正在编写一个递归调用的函数。我在变量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;
  }
}

3 个答案:

答案 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