如何计算递归调用的数量?

时间:2016-06-03 05:40:37

标签: python python-3.x recursion

如前。我通过递归编写fibonancci代码 -

def fib(n):
    x = 0
    if n == 0 or n == 1:
        return 1
    else:
        print('computing : ', n) # this show the recursive call.
        x = x +1
        print('recursive call no total : ',x) # this show the how many number of recursive call.
        return fib(n-1) + fib(n-2)

但是这个印刷品, 递归呼叫号码:1 递归呼叫号码:1 并继续1。

发生了一些问题。我无法弄清楚。 x的值不会增加,因为它不是迭代过程。但是我如何通过每次递归调用增加x的值?

使用全局变量,我试图解决ans。代码可能如下 -

def fib(n):
    global numcalls
    numcalls += 1 #this will increment with every fib() call
    if n ==0 or n ==1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
    print('numcalls =', numcalls)

然后调用函数, numcalls = 0 FIB(5)

上面的代码是否正常?如果没有,那么建议一些关于错误的事情。

2 个答案:

答案 0 :(得分:2)

这样做的几种方法

我们可以尝试使用计数器进行轻微更改:

def fib(n):
    if n == 0 or n == 1:
        return 1
    else:
        print('computing : ', n)  # this show the recursive call.
        fib.x = fib.x + 1
        # this show the how many number of recursive call.
        print('recursive call no : ', fib.x)
        return fib(n - 1) + fib(n - 2)

fib.x = 0
fib(6)

我们也可以使用装饰,请参阅Python: static variable decorator

这样做的副作用是每次调用fib时都需要手动重置fib.x = 0,在函数中处理这个的一种方法是通过一个额外的参数,只能通过递归调用来指定不重置fib.x = 0

def fib(n, _from_user=True):
    if _from_user: #default was used so the call was from the user, set x to 0 now
        fib.x = 0
    if n == 0 or n == 1:
        return 1
    else:
        print('computing : ', n)  # this show the recursive call.
        fib.x = fib.x + 1
        # this show the how many number of recursive call.
        print('recursive call no : ', fib.x)
         #pass _from_user =  False for sub calls
        return fib(n - 1, False) + fib(n - 2, False)

fib(6)

答案 1 :(得分:0)

使用全局变量,我试图解决ans。代码可能如下 -

$scope.ErrorModal = function(index) {
      var modalInstance = $uibModal.open({
        animation: true,
        backdrop: 'static',
        templateUrl: "/PopUpErrorMessage.html",
        controller: "popupErrorMsgController",
        controllerAs: "PEMCtrl",
        size: "md",
        resolve: {
          modalInstanceData: {
            headerText: "Error",
bodyText:reason.statusText
          }
        }
      });
      modalInstance.result.then(function(receivedObject) {
        //Modal closed
      });

然后调用函数, numcalls = 0 FIB(5)

上面的代码是否正常?如果没有,那么建议一些关于错误的事情。