Contents
EJERCICIO 6
Escribir una función recursiva para resolver el problema de la Torres de Hanoi y probarla para un valor 5 discos.
function hanoi num_max_discos=10; % Numero maximo de discos permitidos altura_disco=5; % altura de un disco ancho_disco=60; % grosor de un disco n=num_max_discos; while n>=num_max_discos n=input(strcat('cuantos discos existen (<',int2str(num_max_discos),'): ')); end columna=[1:n;zeros(2,n)]; % Estado de la columnaumna disco=1:n; % Manejo del disco init(n); % columnaumnas y discos de inicio move(n,1,3,2); % starting moving %init 3 columnaumns % DIBUJADO DE DISCOS EN LA PRIMERA columnaUMNA function init(n) figure('color','white'); title('Torres de Hanoi','color',[.6 0 0]) axis off; axis([0 800 0 100]); %DIBUJAR columnaUMNAS 1,2,3 line([200 200],[0 50], 'LineWidth',2); line([400 400],[0 50], 'LineWidth',2); line([600 600],[0 50], 'LineWidth',2); %DIBUJADO DE DISCOS EN LA PRIMERA columnaUMNA for d=1:n disco(d)=rectangle('Position',[200-(n+1-d)*ancho_disco/2,(d-1)*altura_disco,(n+1-d)*ancho_disco,altura_disco],'facecolor','r'); end end function move(n,c1,c3,c2) if n>0 move(n-1,c1,c2,c3) move_a_disco(c1,c3) move(n-1,c2,c3,c1) end end %mover un disco desde el origen al destino function move_a_disco(source,dest) % encuentra el disco superior en la fuente i=1; while i<=size(columna,2) && columna(source,i)>0 i=i+1; end i=i-1; % sacar el disco de la fuente d=columna(source,i); columna(source,i)=0; % encuentra el disco superior j=1; while columna(dest,j)>0 j=j+1; end % pone ese disco en ese lugar correpondiente columna(dest,j)=d; % mueve el disco de la fuente al lugar % 1. arriba for t=altura_disco*(d-1):80 set (disco(d),'Position',[200*source-(n+1-d)*ancho_disco/2,t,(n+1-d)*ancho_disco,altura_disco]); pause(.01); end % 2. derecha o izquierda set (disco(d),'Position',[200*dest-(n+1-d)*ancho_disco/2,altura_disco*(t-1),(n+1-d)*ancho_disco,altura_disco]); pause(.01); % 3. abajo for t=80:-5:altura_disco*(j-1) set (disco(d),'Position',[200*dest-(n+1-d)*ancho_disco/2,t,(n+1-d)*ancho_disco,altura_disco]); pause(.01); end end % move_a_disco end % hanoi function
Error using input Cannot call INPUT from EVALC. Error in ejercicio_6 (line 13) n=input(strcat('cuantos discos existen (<',int2str(num_max_discos),'): '));