免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2516 | 回复: 13
打印 上一主题 下一主题

有段代码看不懂,请帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-08 13:27 |只看该作者 |正序浏览

  1. #include <stdio.h>

  2. void reverse(char *);
  3. main(){
  4.         char string[80];
  5.         printf("Enter a line of text (80) : ");
  6.         gets(string);

  7.         printf("\nReverse it : \n");
  8.         reverse(string);
  9. }

  10. void reverse(char *s){
  11.   if(s[0]=='\0'){
  12.     return;
  13.   }
  14.   else{
  15.     reverse(&s[1]);
  16.     putchar(s[0]);
  17.   }
  18. }
复制代码


程序会将一个字符传反转,但是在函数递归那块实在是看不明白,能帮忙详细讲解一下吗?

论坛徽章:
0
14 [报告]
发表于 2007-02-08 22:58 |只看该作者
这个算法倒是有点意思,只是效率不高

论坛徽章:
0
13 [报告]
发表于 2007-02-08 20:15 |只看该作者
以上各位只讲了递归的过程,而没有讲思路:
一个字符串的反转输出=先输出当前字符串从第二个字符到末尾的子字符串的反转,再输出当前字符串的第一个字符

论坛徽章:
0
12 [报告]
发表于 2007-02-08 17:32 |只看该作者
哈哈很巧妙的思路啊!

论坛徽章:
0
11 [报告]
发表于 2007-02-08 14:21 |只看该作者
之前没有搞清楚return的作用,我再找找相关资料,非常感谢斑竹

论坛徽章:
0
10 [报告]
发表于 2007-02-08 14:15 |只看该作者
反向输出输入字符串

论坛徽章:
0
9 [报告]
发表于 2007-02-08 13:53 |只看该作者
--

另外,

  1.   if(s[0]=='\0'){
  2.     return;
  3.   }
复制代码


返回到的是最后一次 reverse() 被调用的位置,即 putchar() 的地方,这样可以 putchar() 打出 '\0' 左边的那个字符,再返回。这个时候返回到上一次被调用的位置,然后再 putchar(),返回。再这样,一直继续到第二次被调用的位置,打出第一个字符,收工。

--

论坛徽章:
0
8 [报告]
发表于 2007-02-08 13:46 |只看该作者
不停右移到字符串末尾
然后从最后一个字符开始打印一直打到字符串开始。
意思就是将你输入的字符串倒个。

典型的递归啊

论坛徽章:
0
7 [报告]
发表于 2007-02-08 13:45 |只看该作者
--

  1. void reverse(char *s){
  2.   if(s[0]=='\0'){
  3.     return;
  4.   }
  5.   else{
  6.     reverse(&s[1]);
  7.     putchar(s[0]);
  8.   }
  9. }
复制代码


假设有 buf[20],里面是:'1', '2', '3', '\0', 后面不用管了

那么,reverse(&buf[0]) 的执行过程基本是这样的:

reverse(&buf[0]);   ->   '1'

reverse(&buf[1]);   ->   '2'
  reverse(&buf[2]);   ->   '3'
    reverse(&buf[3]);
      遇零,返回   ->   '\0'
    putchar(buf[2]);   ->   '3'
  putchar(buf[1]);   ->   '2'
putchar(buf[0]);   ->   '1'

就回来了

--

论坛徽章:
0
6 [报告]
发表于 2007-02-08 13:37 |只看该作者

更好的例子,反转一个u8的位

#include stdint.h
#include stdio.h

int main()
{
    uint8_t temp, temp2;
    int j;
    temp = 0x03, temp2 = 0;
    for( j=0; j<8; j++ )
    {
        temp2 = (temp2<<1);
        if( temp&0x01 )
            temp2 |= 0x01;
        temp = temp>>1;
    }
    printf("result = 0x%x\n",temp2);
    return 0;
}
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP