算法(1)——递归算法1

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);

4. 未完待续......

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值