在matlab中快速选择代码

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中使用递归属性?提前致谢

And*_*uri 5

它不是一个递归问题,它只是错误的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)

  • @datodatuashvili :)我不生气!该错误告诉您,您已经超过了Matlab允许的默认递归限制.如果你使用`set(0,'RecursionLimit',N)`你可以将递归限制改为你在N中设置的值.如果你做一个无限递归算法,有一个recursionlimit是很重要的.但是,Matlabs建议你,如果你在N(递归调用量)上走得太远,你可能会崩溃一台错误,通常称为"StackOverflow"(不是开玩笑!) (3认同)