1. 递归简介
人理解迭代,神理解递归。综上所述,还是不理解地好。
递归三要素:
1)明确递归的终止条件
2)给出递归终止时的处理办法
3)提取重复的逻辑,缩小问题的规模
递归的两种解决模式:
1)在递去的过程中解决问题
FUNCTION RECURSION(大规模INPUT)
IF (END_CONDITION)
END
ELSE
SOLVE
RECURSION(小规模)
END
END
SOLVE在RECURSION前
2)在归来的过程中解决问题
FUNCTION RECURSION(大规模INPUT)
IF (END_CONDITION)
END
ELSE
RECURSION(小规模)
SOLVE
END
END
SOLVE在RECURSION后
2. 递归举例1——阶乘
function f = factorial(n)
% ********** function ********** %
% function y=myfunction(a,b)
% 其中a,b是输入函数的参数,y是函数返回的值。
% 当需要返回多个值时,可以将y看作一个数组,
% 或者直接将函数的开头写成如
% function [x,y]=myfunction(x,y)的形式
if n == 0
f = 1;
return;
else
f = n * factorial(n - 1); % Recursive
return;
end
end
3. 递归举例2——汉诺塔问题
function[] = HanNuoTa( n, A, B, C)
if(n == 1)
fprintf('Move sheet %d from %c to %c\n', n, A, C);
else
HanNuoTa(n-1, A, C, B);
fprintf('Move sheet %d from %c to %c\n', n, A, C);
HanNuoTa(n-1, B, A, C);
end
end
n = input('请输入盘数: \n');
HanNuoTa(n, 'A', 'B', 'C');
4. 递归举例3——矩阵旋转问题
function M = rotate(M)
%% ========== End_Condition ========== %%
[n,m] = size(M)
if n ~= m
error('It is not a square matrix')
elseif n == 0 || n == 1
return;
% ********** break continue return ********** %
% break直接跳出该层循环
% continue直接进入该层循环的下一次迭代
% return退出程序或函数返回
end
%% ========== Rotate ========== %%
% 讲矩阵M外围一圈剥离,写成一个行向量
A = [M(1,1:end) M(2:end,end)' M(end,end-1:-1:1) M(end-1:-1:2,1)'];
% 将第一个数移到最后一位
A = [A A(1)];
% 将第一位取空,实现循环旋转
A(1) = [];
M(1,1:end) = A(1:n);
M(2:end,end) = A(n + 1:2 * n - 1);
M(end,end-1:-1:1) = A(2 * n:3 * n - 2);
M(end-1:-1:2,1) = A (3 * n - 1:4 * n - 4);
%% ========== Recursive ========== %%
M(2:end - 1,2:end - 1) = rotate(M(2:end - 1,2:end - 1));
M = 1:9; M = reshape(M,3,3); M = M';
rotate(M);