c ++ recursion查找字符串数组中的最小元素

时间:2015-05-02 05:09:01

标签: c++ recursion

我需要使用递归找到数组中字符串最少的下标,如果数组没有要检查的元素,则返回-1。 这是我到目前为止所提出的,但它不起作用。

int leastElement(string a[], int n)
{
    if(n == 1)
        return 0;



    if(a[0] > a[n])
        a[0] = a[n];

    return leastElement(a, n-1);
}

6 个答案:

答案 0 :(得分:5)

int leastElement(string a[], int n)
{
    if (n <= 0) {
        return -1;
    }
    if (n == 1) {
        return 0;
    }
    int k = 1 + leastElement(a + 1, n - 1);
    if (a[0] < a[k]) {
        return 0;
    } else {
        return k;
    }
}

答案 1 :(得分:1)

递归的一个关键概念是下一次递归带有前一个递归的状态。例如,链表是递归的理想对象,因为下一个递归通常基于先前的链表链接。

在这种情况下,数组需要一个起点和终点来定义一个数组。因此,您需要携带数组的开始和结束索引。

int leastElement(int arr[], int start, int end) {
  if (start >= end -1) {
    return start;
  }
  else {
    int subLeastElement = leastElement (arr, start + 1, end);
    if (arr[start] <= arr[subLeastElement]) {
      return start;
    }
    else {
      return subLeastElement;
    }
  }
}

//This provides a simplified start point
int leastElement(int arr[], int n) {
    return leastElement(arr, 0, n);
}

这里的工作示例:

coliru code

答案 2 :(得分:1)

#include<iostream>
    using namespace std;
    char minimum(char a, char b)
    {
        if(a < b)
            return a;
        else
            return b;

    }
    char leastElement(string a, int n)
    {
        if(n == -1)
            return -1;
        if(n == 0)
            return a[0];
        return minimum(a[n],leastElement(a, n-1));
    }
    int main()
    {
        string a= "AaHelloz";
        //cout<<a;
        cout<<leastElement(a,a.length()-1);

        return 0;
    }

这是通过递归获取字符串中最小字符的简单代码。

答案 3 :(得分:0)

您的递归深度将与n成比例,您可以在每个级别将数组分成两半:

int leastElement(string a[], int n) {
       if (n <= 0)
          return -1;  // paranoid about empty array
       if (n == 1)
          return 0;
       const int left = leastElement(a, n/2);
       const int right = leastElement(a + n/2, n - n/2);
       if (left == -1) // paranoia again
          return right + n/2;
       if (right == -1)
          return left;
       return (a[left] < a[right + n/2]) ? left : right + n/2;
}

int main() {
  string a[] = {
    "ugl", "nvk", "akl", "ngl", "qal", "fgp", 
    "rjv", "kln", "ahf", "lak", "vjh",
    "sdf", "lak", "lmc", "lhf", "wer"
  };
  const int i = leastElement(a, 16);
  cout << i; // returns 8 "ahf"
  return 0;
}

答案 4 :(得分:0)

这个想法是以递归方式访问列表中的每个字符串,然后在递归展开时,用当前最小值检查每个字符串。

int leastElement(std::string a[], int n) {
    if(n == 0)
        return -1;

    int least = leastElement(a, n - 1);
    if (least > -1 && a[least] < a[n - 1]) {
        return least;
    }
    return n - 1;
}

答案 5 :(得分:0)

这是一个演示程序,显示如何编写函数

#include <iostream>
#include <string>

int leastElement( const std::string a[], int n )
{
    if ( n <= 0 ) return - 1;

    int i = 1 + leastElement( a + 1, n - 1 );

    return i == 0 || !( a[i] < a[0] ) ? 0 : i;
}


int main()
{
    std::string a[] = { "C", "D", "A", "E" };

    int i = leastElement( a, sizeof( a ) / sizeof( *a ) );
    std::cout << i << ": " << a[i] << std::endl;

    return 0;
}

程序输出

2: A

注意这种情况

!( a[i] < a[0] )

如果有几个相等的最小元素且这个条件提供了这个要求,通常这些函数必须返回第一个最小元素。

要减小递归的深度,可以将数组拆分为两部分。这是一个示范程序

#include <iostream>
#include <string>

int leastElement( const std::string a[], int n )
{
    if ( n <= 0 ) return -1;
    if ( n == 1 ) return 0;

    int i = leastElement( a, n / 2 );
    int j = n / 2 + leastElement( a + n / 2, n - n / 2 );

    return !( a[j] < a[i] ) ? i : j;
}

int main()
{
    std::string a[] = { "C", "D", "A", "E" };

    int i = leastElement( a, sizeof( a ) / sizeof( *a ) );
    std::cout << i << ": " << a[i] << std::endl;
    return 0;
}

输出与上面相同

2: A