如何在Matlab中不使用全局变量追踪递归斐波那契函数的调用次数
嘿,我懂你现在的处境——课程作业要求用递归实现斐波那契函数,还得追踪函数的调用次数,但又明确禁止用全局变量,可你目前只能靠全局变量搞定次数统计对吧?别愁,我给你一个完美的替代方案!
首先,咱们先说说全局变量的问题:它虽然能实现次数统计,但不符合作业要求,而且如果多次调用这个函数,全局变量的状态还会残留,很容易出bug。那怎么不用全局变量呢?核心思路是让递归函数同时返回两个值:一个是斐波那契的计算结果,另一个是从当前调用开始的总调用次数。
话不多说,直接上修改后的代码:
format long; n = input('请输入n的值:'); [fib_result, call_count] = fib(n); fprintf('%d %d\n', fib_result, call_count); function [res, count] = fib(n) if n == 1 || n == 2 res = 1; count = 1; % 本次调用算1次 else % 递归获取n-1和n-2的结果及各自的调用次数 [res1, count1] = fib(n-1); [res2, count2] = fib(n-2); res = res1 + res2; count = 1 + count1 + count2; % 加上当前这次调用的次数 end end
咱们来拆解一下这个实现的逻辑:
- 函数
fib现在有两个输出参数:res是当前n对应的斐波那契数,count是从这次调用开始,包括自身在内的所有递归调用总次数。 - 当n是1或2时,直接返回结果1,同时因为这是一次独立调用,所以次数count设为1。
- 当n大于2时,我们先递归调用
fib(n-1)和fib(n-2),拿到它们各自的结果和调用次数。然后当前的结果就是两者之和,而总调用次数则是当前这次调用(1次)加上两个子调用的次数总和。 - 在主程序里,我们直接接收这两个返回值,然后打印出来就行,全程不需要任何全局变量。
这个方法完全符合你的作业要求,而且比全局变量的实现更健壮——不管你调用多少次fib函数,每次的调用次数统计都是独立的,不会互相干扰。
内容的提问来源于stack exchange,提问作者Anshul Yadav
相关产品推荐
相关产品推荐

