编写一个递归函数来查找向量中的最小元素(MATLAB)

jum4pzuy  于 2022-11-30  发布在  Matlab
关注(0)|答案(2)|浏览(261)

写一个递归函数来寻找向量中的最小元素。我们不能使用循环,但可以使用if语句。使用RECURSION是必须的。
我想不出任何解决方案,主要问题是如果我定义了一个函数,那么我必须给予它一些值,如果我这样做,那么每当递归发生时,它将再次重置该变量的值。

zdwk9cvp

zdwk9cvp1#

function miminimumis=minimumval(k)
aa=k(1);
k=k(k<k(1));
if length(k)==0
    miminimumis=aa;
  
else
%      this line gives the recursion
     miminimumis=minimumval(k);
   
end

end

这里,我们创建一个新数组,该数组由仅小于第一个元素的元素组成。如果该数组为空,则意味着第一个元素是min,如果不是,则对新数组执行相同操作,除非我们到达空数组。通过在函数定义中使用相同函数来提供递归。

yquaqz18

yquaqz182#

在最坏情况下将问题大小减少1的解将导致递归堆栈具有O(length(array))增长。例如,当数组按降序排列时,筛选数组以生成小于第一个元素的值。对于足够大的数组,这将不可避免地导致堆栈溢出。要避免这种情况,你想使用一个递归将大小为n的问题分解成大小为n/2的两个子问题,产生O(log(length(array)))。
我不是Matlab的用户/程序员,所以我将用伪代码来表达算法。下面假设数组是从1开始的,并且有一个内置函数min(a,b),它产生两个标量ab中的最小值。(如果不是,很容易用if/else逻辑替换min()。)

function min_element(ary) {
  if length(ary) == 1 {
    return ary[1]
  }
  split ary into first_half, second_half which differ in length by no more than 1
  return min( min_element(first_half), min_element(second_half) )
}

也可以使用lo_indexhi_index的两个附加参数来编写。计算中点作为低索引和高索引的整数平均值,并进行两个递归调用min_element(ary, lo_index, mid)min_element(ary, mid+1, hi_index)。基本条件是when lo_index == hi_index,在这种情况下返回该元素。这样应该更快。因为它使用简单的整数运算,并且避免为子问题创建子数组。它的缺点是对最终用户不太友好,最终用户必须通过调用min_element(ary, 1, length(ary))来启动进程。
如果堆栈限制是500,那么使用线性堆栈增长算法,您将被限制为长度小于500的数组。使用上面描述的分治算法,您将不会发生堆栈溢出,除非您有一个长度为~2500的数组,比您实际创建的任何数组都要大得多。

相关问题