我必须为一个带有两个参数的程序编写一个伪代码。一个数组和一个整数。该程序应打印大于整数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);
}
答案 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
search1
在i
开始一个索引(0
),在min
开始一个初始结果(Infinity
)。i
超出范围时,该返回结果min
i
是有界的,因此我们可以检查元素A[i]
是否是新的最小值。如果是这样,请通过递增i
并将结果替换为A[i]
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)
A
是一个空数组,则没有最小值搜索。返回null
结果。search1
在i
(而不是1
)处开始索引0
,并使用第一个元素A[0]
初步结果。这是一个安全的(inductive)假设,因为在此代码分支上,A
至少具有一个元素。