| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 757 人关注过本帖
标题:如何将求幂运算的递归转换为循环?
只看楼主 加入收藏
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
如何将求幂运算的递归转换为循环?
如何将求幂运算的递归转换为循环? x的n次方.
递归:
程序代码:
long pow1(long x, unsigned n)
{
    if (n == 0)
        return 1;
    else if (n % 2 == 1)
        return pow1(x*x, n/2) * x;
    else if (n % 2 == 0)
        return pow1(x*x, n/2);
}
将以上程序转换为循环:
程序代码:
long pow2(long x, unsigned n)
{
    int t[100] = {0}, i = 0;
    if (n == 0)
        return 1;
    while (n > 1) {
        if (n % 2 == 1)
            t[i++] = x;
        x *= x;
        n /= 2;
    }
    for (i = 0; t[i]; i++)
        x *= t[i];
    return x;
}
上面是我写的转换程序, 测试结果是没有问题, 但是有没有其它更好的算法? 算法分析不太会, 不知道转换后的效率是不是差不多, 烦请指导, 谢谢.


搜索更多相关主题的帖子: color 如何 
2014-01-16 16:45
so_love
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:7
帖 子:812
专家分:4151
注 册:2013-11-25
收藏
得分:0 
坐等大神。我没思路。

一花一世界、一叶一追寻、片片花叶落、情系何人身。
2014-01-16 16:50
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
讲一下我的思路: 只是简单地把递归中 return pow1(x*x, n/2) * x; 中的后面那个x的值用一个数组保存, 最后再乘进去.
其它的就直接把递归转换为循环.
2014-01-16 16:56
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
都是一个数量级的,算法层次没什么差别。再送你一段(时间效率相同,空间要省一些)
程序代码:
int pow1(int x, int n)
{
    int r;
    for(r = 1; n; x *= x, n >>= 1)
        if(n & 1) r *= x;
    return r;
}

重剑无锋,大巧不工
2014-01-16 16:58
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
以下是引用beyondyf在2014-1-16 16:58:10的发言:

都是一个数量级的,算法层次没什么差别。再送你一段(时间效率相同,空间要省一些)
int pow1(int x, int n)
{
    int r;
    for(r = 1; n; x *= x, n >>= 1)
        if(n & 1) r *= x;
    return r;
}
喜欢C语言, 因为它的简洁, 高效. 我觉得位运算就是它最迷人的地方, 可惜我现在还处于远观的阶段.
期待版主多发些代码, 这样我书都不用看了.
再次感谢.

[ 本帖最后由 pangshch 于 2014-1-16 17:32 编辑 ]
2014-01-16 17:27
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 5楼 pangshch
不必客气,只要大家喜欢我会多写一些。

我也很想知道你们在学语言的过程中哪些环节比较困惑,哪里最容易卡住挫伤学习的激情。你们学语言的目的是什么?最想用它做什么?

重剑无锋,大巧不工
2014-01-16 18:45
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
回复 6楼 beyondyf
回版主问题的话,目的是学习好啦,以后能在这方面工作发展吧,如果学得很好,最想用它应用在生活中,解决各种各样的有实际意义和价值的问题。
另外说一点版主能力确实让我膜拜,哈哈,更加让人欣赏你为人如此热情,如果有机会,真心想认识认识本人,好好向你学习下啊。

编写的程序,不能改变世界,却可以改变自己...
2014-01-16 19:11
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
以下是引用beyondyf在2014-1-16 18:45:32的发言:

不必客气,只要大家喜欢我会多写一些。
 
我也很想知道你们在学语言的过程中哪些环节比较困惑,哪里最容易卡住挫伤学习的激情。你们学语言的目的是什么?最想用它做什么?
刚开始接触C是因为工作的电脑里面不知道哪一辈的前辈留了一份C基础的资料. 然后我又闲得无聊, 就随便看了看,
后来想了想. 编程也不错(其实我挺崇拜编程高手的, 觉得电脑很神奇), 就打算开始学. 直到现在,
学C的困惑有两个.
一个是: 国内的书(有一本老谭的), 基本上只把C当做从事编程的基础(之后主要学别的编程语言); 国外的书(有几本电子档的), 内容都围绕UNIX(想我一介屌丝, 哪玩得起那个), 也就只能学到基础.所以我现在还是基础.
另一个是: 下一步学什么. 我想学了就转行, 那基本上有两条路, 1, 是报培训班.(第一是时间问题, 第二是经济问题(主要)); 2. 是现在就去应聘(感觉希望非常渺茫).
所以我现在只是学学算法, 算是兴趣爱好吧. 也想过学其它编程语言, 但是觉得C就是九阴真经, 其它的好像是九阴白骨爪, (C++个人感觉并不比C强大).
版主问哪里最容易卡住, 我现在就感觉卡住了, 要么把C纯当兴趣爱好(没这条件, 等于放弃), 要么就转行(压力山大, 目标不明).

总结一下上面的就是: 因为兴趣和处境而学习, 因为目的不坚定而徘徊.
2014-01-17 11:02
快速回复:如何将求幂运算的递归转换为循环?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023253 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved