修改Octave/Matlab的rtfib函数以支持多值输入
修改Octave/Matlab的rtfib函数支持多值输入
要让你的rtfib函数支持像rtfib(1:8)这样的向量输入,我们只需要在原函数基础上添加对向量输入的处理逻辑就行,这里有两种实用的实现方式:
方法一:用arrayfun快速复用原有逻辑
这种方法代码最简洁,直接利用Octave/Matlab的arrayfun函数,把原有的标量处理逻辑自动应用到输入向量的每个元素上:
function [f] = rtfib(n) % 先判断输入是否为向量,如果是就逐个处理每个元素 if isvector(n) f = arrayfun(@rtfib, n); return; end % 原有负数处理逻辑保持不变 if n < 0 multi = -1; n = abs(n); else multi = 1; end % 合并n=1和n=2的判断,让代码更简洁 if n == 0 f = 0; elseif n == 1 || n == 2 f = 1; else fOld = 1; fOlder = 1; for i = 3:n f = fOld + fOlder; fOlder = fOld; fOld = f; end end f = f * multi; end
测试效果:
- 输入
rtfib(8)→ 返回21(和原函数功能一致) - 输入
rtfib(1:8)→ 返回[1, 1, 2, 3, 5, 8, 13, 21] - 输入
rtfib(-3)→ 返回-2 - 输入
rtfib(-1:-1:-8)→ 返回[-1, -1, -2, -3, -5, -8, -13, -21]
方法二:直接遍历向量元素(效率更高)
如果你的输入向量规模很大,arrayfun会有一定的函数调用开销,这时可以直接遍历每个元素计算,运行效率会更优:
function [f] = rtfib(n) % 把输入统一转为列向量,方便批量处理 original_shape = size(n); n = n(:); len = length(n); f = zeros(len, 1); % 遍历每个输入元素 for k = 1:len num = n(k); multi = 1; % 负数处理 if num < 0 multi = -1; num = abs(num); end % 计算对应斐波那契数 if num == 0 val = 0; elseif num == 1 || num == 2 val = 1; else fOld = 1; fOlder = 1; for i = 3:num val = fOld + fOlder; fOlder = fOld; fOld = val; end end f(k) = val * multi; end % 保持输出和原输入的维度一致(行向量/列向量) f = reshape(f, original_shape); end
这个版本会先把输入转为列向量统一处理,最后再还原成原输入的形状,确保输出的维度和输入完全匹配,同时避免了函数调用的额外开销。
选择建议
- 如果输入规模不大,优先选方法一,代码更简洁,后续维护也更方便;
- 如果需要处理大规模的输入向量,方法二的运行效率会更高。
内容的提问来源于stack exchange,提问作者Rick T
相关产品推荐
相关产品推荐

