dat*_*ili -1 matlab tail-recursion
让我们考虑下面的伪代码
QuickSelect(A, k)
let r be chosen uniformly at random in the range 1 to length(A)
let pivot = A[r]
let A1, A2 be new arrays
# split into a pile A1 of small elements and A2 of big elements
for i = 1 to n
if A[i] < pivot then
append A[i] to A1
else if A[i] > pivot then
append A[i] to A2
else
# do nothing
end for
if k <= length(A1):
# it's in the pile of small elements
return QuickSelect(A1, k)
else if k > length(A) - length(A2)
# it's in the pile of big elements
return QuickSelect(A2, k - (length(A) - length(A2))
else
# it's equal to the pivot
return pivot
Run Code Online (Sandbox Code Playgroud)
我在matlab中编写了以下代码
function []=Quickselect(A,k);
% A-unsorted array
%k-we want to return kth largest element
% let r be chosen uniformly at random in the range 1 to length(A)
i=1; %initialize index
j=1; %initialize index
n=length(A);%length of array
r=floor(1+(n-1)*rand);%random index
pivot=A(r); % choose pivot as A(r);
A1=zeros(1,n); %create additional arrays
A2=zeros(1,n);%create additional arrays
for m=1:n
if A(m)<k
A1(i)=A(m);
i=i+1;
else if A(m)>k
A2(j)=A(m);
j=j+1;
end
end
end
if k <= numel(A1)
return Quickselect(A1,k);
else if k > (length(A) - length(A2))
return Quickselect(A2, k - (length(A) - length(A2)));
else
return pivot;
end
end
end
Run Code Online (Sandbox Code Playgroud)
>> A=[2 1 4 3 6 5 7 9 8 10 11 13 21 12];
>> Quickselect(A,3)
Error: File: Quickselect.m Line: 23 Column: 10
Unexpected MATLAB expression.
Run Code Online (Sandbox Code Playgroud)
我不明白错误的原因,我不能在Matlab中使用递归属性?提前致谢
它不是一个递归问题,它只是错误的Matlab语法.
在Matlab中,return不会强制返回变量,而只是使函数停止并退出.如果你想返回你的函数应该开始的东西:
function [outvar]=Quickselect(A,k);
Run Code Online (Sandbox Code Playgroud)
每次你有一个
return pivot;
Run Code Online (Sandbox Code Playgroud)
要么
return Quickselect(A1,k);
Run Code Online (Sandbox Code Playgroud)
你应该修改它
outvar=pivot; % or outvar=Quickselect(A1,k);
return;
Run Code Online (Sandbox Code Playgroud)