如前。我通过递归编写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)
上面的代码是否正常?如果没有,那么建议一些关于错误的事情。
答案 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)
上面的代码是否正常?如果没有,那么建议一些关于错误的事情。