一个程序,该程序计算大于给定int x的数组中的最小元素。 (使用递归)

时间:2019-05-11 15:03:12

标签: algorithm recursion

我必须为一个带有两个参数的程序编写一个伪代码。一个数组和一个整数。该程序应打印大于整数x的数组的最小元素。我已经写了这个程序,它工作正常。我现在必须使用递归来重新编写代码。

我编写了使用递归的伪代码,当我进行递归调用时,我将参数传递给数组[currentIndex -1],这样做是为了使程序进行递归调用,最后索引可以降为零并且递归可以退出。

我想知道递归是否以此方式工作,或者在这种情况下是否有其他方法可以实现递归。

如果我使用seachElement(A [currentIndex -1],x)递归地调用函数,递归调用会成功吗?我担心的是将索引号放在数组中将使其指向单个元素而不是整个数组。以及这样做是否正确。

searchElement(int A[], int x) {

n = A.length;
sum = -1;
if (A[0] == x) { sum++; return sum;}
else if (A[0] != x) {return sum;}

currentIndex = n - 1;
if(A[currentIndex] == x) {sum++;}
seachElement(A[currentIndex -1],x);
}

1 个答案:

答案 0 :(得分:1)

递归是一种功能性遗产,因此将其与功能性样式一起使用可产生最佳效果。在函数样式中,函数具有参照透明性-给定相同的输入,它们始终会产生相同的输出。这意味着我们避免了诸如变异和变量重新分配之类的会产生混淆结果且难以推理的事情。在这里,我们使用带有附加状态参数的辅助函数来跟踪正在进行的计算。

search (int A[], int x)
  search1 (A, x, 0, Infinity)        # 1

search1 (int A[], int x, int i, int min)
  if (i >= A.length)
    min                              # 2
  else if (A[i] > x && A[i] < min)
    search1(A, x, i + 1, A[i])       # 3
  else
    search1(A, x, i + 1, min)        # 4
  1. 使用帮助器功能search1i开始一个索引(0),在min开始一个初始结果(Infinity)。
  2. i超出范围时,该返回结果min
  3. i是有界的,因此我们可以检查元素A[i]是否是新的最小值。如果是这样,请通过递增i并将结果替换为A[i]
  4. 重现
  5. 否则,i仍在范围之内,但未找到新的最小值。通过递增i来重现,但保持先前的结果(min)不变。

或者,如果您不能使用Infinity,则当A是一个空数组时,您需要其他方法来处理该情况-

search (int A[], int x)
  if (A.length == 0)
    null                           # 1
  else
    search1 (A, x, 1, A[0])        # 2

search1 (int A[], int x, int i, int min)
  if (i >= A.length)
    min
  else if (A[i] > x && A[i] < min)
    search1(A, x, i + 1, A[i])
  else
    search1(A, x, i + 1, min)
  1. 如果A是一个空数组,则没有最小值搜索。返回null结果。
  2. 否则,请使用辅助函数search1i(而不是1)处开始索引0,并使用第一个元素A[0]初步结果。这是一个安全的(inductive)假设,因为在此代码分支上,A至少具有一个元素。