我该如何解决此问题(is_sorted),递归函数?

时间:2015-04-18 16:00:52

标签: c arrays string recursion

我如何解决此问题(is_sorted),递归函数? 目标:此函数将字符串作为输入参数,如果字符串中的字符按字母顺序升序,则返回TRUE;否则返回FALSE。字符可以是小写或大写。

#include<stdio.h>
#define SIZE 50
typedef enum{FALSE,TRUE} Bool;

Bool is_sorted(const char *str);

int main(){

    char arr1[SIZE]="aSTYoLPNDeSaFAE";  
    char arr2[SIZE]="aGjklOvz";

    if(is_sorted(arr1)==TRUE){
        printf("arr1 (is_sorted) Yes \n");
    }
    else
    {
        printf("arr1 (is_sorted) No \n");
    }

    if(is_sorted(arr2)==TRUE){
        printf("arr2 (is_sorted) Yes \n");
    }
    else
    {
        printf("arr2 (is_sorted) No \n");
    }

    return 0;
}

Bool is_sorted(const char *str){
    if(str[0]=='\0'){
        return FALSE;
    }
    else if(strcmp(&str[0],&str[1])<0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }

    return is_sorted(&str[1]);
}

2 个答案:

答案 0 :(得分:1)

程序中正确的is_sorted函数应如下所示:

#include <ctype.h>
#include <stdio.h>

Bool is_sorted(const char *str){
    if(str[0]=='\0'){
        return TRUE; //the string is empty
    }
    else if(str[1]=='\0'){
        return TRUE; //the string contains only one character or all letters before NULL are in correct order
    }
    else if(tolower(str[0])<tolower(str[1])))
    {
        return is_sorted(&str[1]); //current and next letter are in correct order
    }
    else
    {
        return FALSE; //current and next letter are in wrong order, thus whole string is not sorted
    }
}

答案 1 :(得分:1)

我在您的代码中看到了3个问题,让我先介绍代码中的问题,然后再展示一个可行的解决方案。

首先关闭:

if(str[0]=='\0'){
    return FALSE;
}

为什么不对空字符串进行排序?哪些元素出了故障?毕竟它是空的。

接下来,您无法正确处理大写/小写:

if(strcmp(&str[0],&str[1])<0)

strcmp比较ascii值。大写字母的值低于小写字母。这意味着strcmp("G", "a")<0将返回true。你真的想比较小写字母。你也在比较字符串而不是字母。

最后,你永远不会接到你的递归电话。

if(str[0]=='\0'){
    return FALSE;
}
else if(strcmp(&str[0],&str[1])<0)
{
    return TRUE;
}
else
{
    return FALSE; // return if you didn't return in any other condition
}

return is_sorted(&str[1]); // You never get here.

至于我的解决方案:

Bool is_sorted(const char *str){
    if(str[0]=='\0' || str[1] == '\0'){
        return TRUE; // A single character as well as a empty string are
    }                // by definition sorted already.
    else if(tolower(str[0]) < tolower(str[1))
    {
        return is_sorted(str + 1); //First two characters are sorted we got to check
    }                            // if the rest are sorted too.
    else
    {
        return FALSE; // If the first two characters aren't sorted the whole
    }                 // string isn't sorted.
}