count变量在递归函数调用中没有更新

时间:2015-07-09 07:12:18

标签: python

以下代码正在查找排列,但count变量未更新。任何人都可以指出错误,为什么count的变化没有反映出来。

def swap_arr_elems(arr, src_idx, dest_idx):
    tmp = arr[src_idx]
    arr[src_idx] = arr[dest_idx]
    arr[dest_idx] = tmp
    return

def permuate(arr, left, right, output, count):
    if left == right:
        output.append(list(arr))
        count += 1
        #count.append('1')
        return

    for i in range(left, right, 1):
        swap_arr_elems(arr, left, i)
        permuate(arr, left + 1, right, output, count)
        swap_arr_elems(arr, left, i)


if __name__ == '__main__':
    count = 0    
    #count = []
    test_input = ['a', 'b', 'c']
    test_output = []
    permuate(test_input, 0, len(test_input), test_output, count)
    print("count : " + str(count))
    for item in test_output:
        print(item)

编辑1:

output of the above code is:
count : 0
['a', 'b', 'c']
['a', 'c', 'b']
['b', 'a', 'c']
['b', 'c', 'a']
['c', 'b', 'a']
['c', 'a', 'b']

5 个答案:

答案 0 :(得分:4)

你只是在count时增加left==right,然后你从它返回,增加计数不会在调用函数中自动增加它,你可以尝试返回计数然后接受它在它被调用的函数中。

示例 -

def permuate(arr, left, right, output, count):
    if left == right:
        output.append(list(arr))
        count += 1
        #count.append('1')
        return count

    for i in range(left, right, 1):
        swap_arr_elems(arr, left, i)
        count += permuate(arr, left + 1, right, output, count)
        swap_arr_elems(arr, left, i)
    return count

if __name__ == '__main__':
    count = 0    
    #count = []
    test_input = ['a', 'b', 'c']
    test_output = []
    count = permuate(test_input, 0, len(test_input), test_output, count)
    print("count : " + str(count))
    for item in test_output:
        print(item)

答案 1 :(得分:2)

是的,count变量的范围仅在主循环中。

count循环中的{p> if main变量和permuate函数中的计数变量不同。

如果你想要来自permuate函数的count变量值,那么从function返回计数值并在count变量中接受。

<强>演示:

>>> count = 10
>>> def test(count):
...    count += 1
...    print "In test:", id(count)
...    return count
... 
>>> count = test(count)
In test: 149784632
>>> count 
11

答案 2 :(得分:1)

permuate函数未返回任何值。它只是以你编写它的方式返回控制流。因此,您必须将其修改为return count。此外,您的swap_arr_elems函数没有做任何事情,因为它没有返回任何值。或者,您可以将count中的变量permuate定义为global

答案 3 :(得分:1)

我个人将此名称命名为可变和不可变效果不知道它的真实姓名

计数是一个整数。这是一个不可变对象,它的范围在主函数内,因此它的值不会改变

当你执行count+=1时,会创建一个新对象并且不返回该对象

test_output 是一个List.This是一个可变对象。即使你更改了它的值,它也会在同一个列表中被更改

output.append(list(arr)) #adds to the same  test_output list

有关可变和不可变对象和行为的更多见解,请参阅此link

根据@brunodesthuilliers output=output+list(arr)更改输出。这是因为+创建了一个新对象,请参阅下面的说明

>>> out=[1,2,3]
>>> id(out)
33535760
>>> out.append(2)
>>> id(out)
33535760
>>> out=out+[3]
>>> id(out)
33535600

答案 4 :(得分:1)

原语是不可改变的。当您尝试增加函数内的计数时,您正在切换函数内部所指的内存地址count,外部count未更改:

在CPython中作为实现细节,对象的id也是内存地址,因此我们可以清楚地看到这种情况发生:

def fn(inside_count):
    print id(inside_count), '- inside_count before increment' 
    inside_count += 1
    print id(inside_count), '- inside_count after increment'

outside_count = 1
​
print id(outside_count), '- outside_count before fn call'
fn(outside_count)
print id(outside_count), '- outside_count after fn call'
140536048575784 - outside_count before fn call
140536048575784 - inside_count before increment
140536048575760 - inside_count after increment
140536048575784 - outside_count after fn call 

列表对象的行为不同,因为您在对象上调用append函数。 inside_output引用的内存地址不会改变,内存地址的对象也会改变。

def fn(inside_output):
    print id(inside_output), '- inside_output before append' 
    inside_output.append('1')
    print id(inside_output), '- inside_output after append'

outside_output = []
​
print id(outside_output), '- outside_output before fn call'
fn(outside_output)
print id(outside_output), '- outside_output after fn call'
4389007440 - outside_output before fn call
4389007440 - inside_output before append
4389007440 - inside_output after append
4389007440 - outside_output after fn call

话虽如此,因为你在列表中有你的排列,你应该这样做:

print("count : " + str(len(test_output)))