【问题标题】:A program that computes the smallest element in an array which is larger than given int x. (using recursion)计算数组中大于给定 int x 的最小元素的程序。 (使用递归)
【发布时间】:2019-05-11 15:03:11
【问题描述】:

我必须为带有两个参数的程序编写一个伪代码;一个数组和一个整数。程序应该打印数组中大于整数 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);
}

【问题讨论】:

    标签: algorithm recursion


    【解决方案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. 使用辅助函数 search1 在 0 开始索引 (i),在 Infinity 开始初始结果 (min)。
    2. 当i越界时,是时候返回结果了,min
    3. i 在界限内,因此我们可以检查元素 A[i] 是否是新的最小值。如果是这样,通过递增i 并用A[i] 替换结果来重复
    4. 否则,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. 否则,使用辅助函数search1 在1(而不是0)处开始索引i,并使用第一个元素A[0] 作为初始结果。这是一个安全的 (inductive) 假设,因为在此代码分支上,A 已知至少有一个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-19
      • 2019-06-14
      • 2021-04-05
      • 1970-01-01
      • 2012-03-16
      • 2022-01-06
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多