Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用尾部递归求数组的最小元素_C++_Algorithm - Fatal编程技术网

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上返回什么