C :使用递归在字符串中找到最小值的位置

C++: Use recursion to find the POSITION of the smallest value in a string?

本文关键字:最小值 位置 字符串 递归      更新时间:2023-10-16

如何使用递归来找到字符串中最小值的位置?我唯一可以拥有的2个参数是数组及其大小。

两参数限制要求您使用一个小技巧:由于不允许您将索引添加为第三个参数,请改用长度。您将将递归运行的结果与范围0..length-1的最后一个元素进行比较。

推理是这样的:

  • 如果数组的长度为1,请返回初始元素的索引
  • 否则,运行length-1的算法,并将从递归调用返回的索引与最后一个元素的值进行比较(即在索引length-1
  • 如果最后一个元素较小,请返回length-1
  • 否则,返回从递归调用获得的索引

如果它是一个普通的数组,则可以修改指针(并相应地减小大小)以获取"子阵列"以传递到下一个递归级别。这样的东西:

size_t minpos(int *arr, size_t length)
{
    if(length < 2) return 0;
    size_t pos1 = minpos(arr + 1, length - 1);
    if(arr[pos1] < arr[0]) return pos1 + 1;
    else return 0;
}

如果您需要在包含字符串的字符数组中找到最小的字符,则完全不清楚为什么函数必须具有两个参数。通常,处理字符串的算法只需一个参数。

所以我写了一个只有一个参数的函数,并返回最小的字符,不包括终止零。

这是功能

#include <iostream>
size_t min_character( const char *s )
{
    if ( s[0] == '' ) return 0;
    size_t n = min_character( s + 1 ) + 1;
    return ( s[n] == '' ) || !( s[n] < s[0] ) ? 0 : n;
}
int main()
{
    const char *s = "anon123";
    size_t n = min_character( s );
    std::cout << n << ": '" << s[n] << ''' << std::endl;
    return 0;
}

程序输出是

4: '1'

因为给定字符串中最小的字符是字符'1',并且它的poistion 4从0。

开始。

使用两个参数,该函数看起来像

size_t min_character( const char *s, size_t n )
{
    if ( n == 0 ) return 0;
    size_t i = min_character( s + 1, n - 1 ) + 1;
    return ( i == n ) || !( s[i] < s[0] ) ? 0 : i;
}