C++ 用尾部递归求数组的最小元素
给定一个大小为C++ 用尾部递归求数组的最小元素,c++,algorithm,C++,Algorithm,给定一个大小为n的整数数组a,用原型编写一个尾部递归函数 int f(int a[], int n); 它查找数组的最小元素 这是我想出的最好的办法: int f(int a[], int n) { static int *min; if (min == 0) min = new int(a[n - 1]); else if (*min > a[n - 1]) *min = a[n - 1]; if (n == 1) re
n
的整数数组a
,用原型编写一个尾部递归函数
int f(int a[], int n);
它查找数组的最小元素
这是我想出的最好的办法:
int f(int a[], int n)
{
static int *min;
if (min == 0)
min = new int(a[n - 1]);
else if (*min > a[n - 1])
*min = a[n - 1];
if (n == 1)
return *min;
else
return f(a, n - 1);
}
它能变得更好吗?我不喜欢使用静态变量。kmkaplan的解决方案非常棒,我比他投了更高的票。这将是我不太棒的解决方案:
int f(int a[], int n)
{
if (n == 1)
return a[0];
n--;
return f(a + (a[0] > a[n]), n);
}
int f(int a[], int n)
{
if(n == 1)
return a[0];
n--;
if(a[0] > a[n])
a[0] = a[n];
return f(a, n);
}
数组的最小元素在任何给定时间都存储在[0]中。我最初包括一个非修改版本,但后来我意识到它不是尾部递归的 你可以做得更好。递归中不容易掌握(因此被利用)的东西是使用堆栈在过程中保存临时值。想一想。我收集的阵列没有任何排序。@ashley那会有点失去它的乐趣=P@WhozCraig不像在已经优化的alg中寻求一些激烈的东西那么有趣。你想怎么走就怎么走。他对代码的反应太多。如果当前堆栈帧中的[0]大于[n],则在递归调用中将数组的起点上移1。它也相当巧妙。我希望我能多次投票。@JosuéMolina这是C,没有布尔值:
a[0]>a[n]
的结果是0
或1
。它就像(a[0]>a[n])?(a+1):a
@JosuéMolina这是指针算法。通过向指针添加1
,递归步骤将获得数组中的下一个位置。也就是说,如果当前值(a[0]
)大于上一个值,则当前值不能是最小的元素,因此不妨尝试下一个。否则,我们将保持当前值,直到“收缩”数组(n--
)。我们剩下的是最小的值。唯一的呕吐方式是如果分级器通过的大小值小于1(但问题中没有给出零长度数组的规范。但这是唯一一个被标记下来的机会,否则这是一个很好的答案)。确切地说。你在n上返回什么