鱼C论坛

 找回密码
 立即注册
查看: 1414|回复: 10

递归还是用不好

[复制链接]
发表于 2015-3-25 13:11:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[20],s2[20];
    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谢谢

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-25 13:55:42 | 显示全部楼层
你写的我懒得看,自己写了一个
#include<stdio.h>
int strcmp2(char p1[],char p2[]);
int main()
{
        int i;
        char s1[20],s2[20];
        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[i]==p2[i])
        {
                i++;
                return strcmp2(p1,p2);
        }
        else
                return  (int)p1[i]-(int)p2[i];
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-25 13:56:46 | 显示全部楼层
     return  (int)p1[i]-(int)p2[i];
这里的强制转换 int  可以去掉,一个效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-25 13:58:15 | 显示全部楼层
你代码怎么那么长啊???我晕死。要是递归那么长何必用递归呢,,,不如用for循环还好看点:sweat:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-25 14:02:57 | 显示全部楼层
还有点问题,忘记了全部一样返回0了。。。。我勒个去
补上。。
#include<stdio.h>
int strcmp2(char p1[],char p2[]);
int main()
{
        int i;
        char s1[20],s2[20];
        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[i]==p2[i]&&p1[i]!='\0'&&p2[i]!='\0')
        {
                i++;
                return strcmp2(p1,p2);
        }
        else if(p1[i]!=p2[i])
                return  p1[i]-p2[i];
        else
                return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我就是个笨人呀,才写这么长 :cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有道理啊。。。没想这么多,反正只是比较一次。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[20],s2[20];
        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));
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

再看了下你的。。。我改写的和你一模一样。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码好简单呀,学习了 :handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 19:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表