haiouda 发表于 2015-3-25 13:11:59

递归还是用不好

本帖最后由 haiouda 于 2015-3-25 14:10 编辑

/***************************************************************************
写一个函数,实现两个字符串的比较。即自己写一个 strcmp 函数,函数原型为
int strcmp(char *p,char *p2);   设p1指向字符串s1,p2指向 s2 。要求当
s1=s2 时,返回值为 0;s1!=s2,返回它们二者第一个不同字符的ASCII码
差值(如“BOY“与“BAD”,第 2 个字母不同,“O”与“A”之差为79-65=14)。
如果 s1 > s2 ,则输出正值;如果 s1 <s2,则输出负值。
***************************************************************************/


#if(1)
#include <stdio.h>

int main()
{
      int strcmp(char *y1,char *y2);
      char *p1,*p2,s1,s2;
    int q=0;
      printf("请输入字符串s1=:");
   gets(s1);
      printf("请输入字符串s2=:");
   gets(s2);

                p1=s1; p2=s2;
      printf("%d\n",strcmp(p1,p2));
      
         return 0;
}

int strcmp(char *y1,char *y2)
{
      int t;

      
      if (*(y1)!=*(y2))
      {      t=*(y1)-*(y2);               
       return t;
                }
      if( *(y1)=='\0' && *(y2)=='\0')
      {      
                t=0;
               return t;
      }
                  
         t=strcmp(y1+1,y2+1);
                     
          return t;
}
#endif



递归还是用不好,现在有个警告,哪位能帮改改:handshake
终于改好拉:lol: 可是这么用递归怎么还是不对劲,哪位能再上面基础上再进行改进下,:handshake谢谢

仰望天上的光 发表于 2015-3-25 14:14:54

#include <stdio.h>

int strcmp( char* str1, char* str2 );
int main() {
        printf( "%d\n",strcmp("hello", "hello1") );
        printf( "%d\n",strcmp("hello1", "hello") );
        printf( "%d\n",strcmp("hello", "hello") );
}

int strcmp( char* str1, char* str2 ) {
        return (*str1==0 && *str2==0)? 0:
                                (*str1!=*str2)?(*str1-*str2):strcmp(str1+1, str2+1);
}
2楼代码不正确,如果在main中第二次调用strcmp2会出错,因为你用了static int i

秀丽江山 发表于 2015-3-25 13:55:42

你写的我懒得看,自己写了一个
#include<stdio.h>
int strcmp2(char p1[],char p2[]);
int main()
{
        int i;
        char s1,s2;
        scanf("%s",s1);
        fflush(stdin);
        scanf("%s",s2);
        i=strcmp2(s1,s2);
        printf("%d\n",i);

        return 0;
}
int strcmp2(char p1[],char p2[])
{
        static int i=0;
        if(p1==p2)
        {
                i++;
                return strcmp2(p1,p2);
        }
        else
                return(int)p1-(int)p2;
}

秀丽江山 发表于 2015-3-25 13:56:46

   return(int)p1-(int)p2;
这里的强制转换 int可以去掉,一个效果

秀丽江山 发表于 2015-3-25 13:58:15

你代码怎么那么长啊???我晕死。要是递归那么长何必用递归呢,,,不如用for循环还好看点:sweat:

秀丽江山 发表于 2015-3-25 14:02:57

还有点问题,忘记了全部一样返回0了。。。。我勒个去
补上。。
#include<stdio.h>
int strcmp2(char p1[],char p2[]);
int main()
{
        int i;
        char s1,s2;
        scanf("%s",s1);
        fflush(stdin);
        scanf("%s",s2);
        i=strcmp2(s1,s2);
        printf("%d\n",i);

        return 0;
}
int strcmp2(char p1[],char p2[])
{
        static int i=0;
        if(p1==p2&&p1!='\0'&&p2!='\0')
        {
                i++;
                return strcmp2(p1,p2);
        }
        else if(p1!=p2)
                returnp1-p2;
        else
                return 0;
}

haiouda 发表于 2015-3-25 14:13:01

秀丽江山 发表于 2015-3-25 13:58
你代码怎么那么长啊???我晕死。要是递归那么长何必用递归呢,,,不如用for循环还好看点

我就是个笨人呀,才写这么长 :cry

秀丽江山 发表于 2015-3-25 14:31:07

仰望天上的光 发表于 2015-3-25 14:14
2楼代码不正确,如果在main中第二次调用strcmp2会出错,因为你用了static int i

有道理啊。。。没想这么多,反正只是比较一次。。。

秀丽江山 发表于 2015-3-25 14:54:09

仰望天上的光 发表于 2015-3-25 14:14
2楼代码不正确,如果在main中第二次调用strcmp2会出错,因为你用了static int i

我又写了一个。。去掉了那个static int; 现在应该可以了
#include<stdio.h>
int strcmp2(char p1[],char p2[]);
int main()
{
        int i;
        char s1,s2;
        scanf("%s",s1);
        fflush(stdin);
        scanf("%s",s2);
        i=strcmp2(s1,s2);
        printf("%d\n",i);

        return 0;
}
int strcmp2(char p1[],char p2[])
{
        if(*p1=='\0'&&*p2=='\0')
                return 0;
        else if(*p1 != *p2)
                return *p1-*p2;
        else
                return strcmp2((p1+1),(p2+1));
}

秀丽江山 发表于 2015-3-25 14:56:31

仰望天上的光 发表于 2015-3-25 14:14
2楼代码不正确,如果在main中第二次调用strcmp2会出错,因为你用了static int i

再看了下你的。。。我改写的和你一模一样。。。

haiouda 发表于 2015-3-25 20:51:01

仰望天上的光 发表于 2015-3-25 14:14
2楼代码不正确,如果在main中第二次调用strcmp2会出错,因为你用了static int i

代码好简单呀,学习了 :handshake
页: [1]
查看完整版本: 递归还是用不好