免费注册 查看新帖 |

Chinaunix

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

[C] 一个递归的程序有问题,求指正 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-26 10:24 |只看该作者 |倒序浏览
各位前辈,我做了个用递归求一个数整数次幂的程序,但总是运行结果不对,麻烦各位指正,多谢!
  1. #include <stdio.h>
  2. #include <math.h>

  3. double xpow(double, int); //求幂函数

  4. int main(void)
  5. {
  6.     int pow;
  7.     double base, ans;

  8.     printf("Enter a number and an integer power to which the number will be raised. Enter q to quit.\n");
  9.     while(scanf("%lf%d", &base, &pow) == 2)  //输入底数和指数
  10.     {   
  11.         ans = xpow(base, pow);     //调用求幂函数
  12.         printf("\n%.3g to the power %d is %.5g\n", base, pow, ans);
  13.         printf("Enter the next pair of numbers or q to quit.\n");
  14.     }
  15.     printf("\nHope you enjoyed this power trip -- bye!\n");
  16.    
  17.     return 0;
  18. }

  19. double xpow(double base, int power)
  20. {
  21.     double powval = 1.0;

  22.     if(base == 0)
  23.         return 0;         //底为0,幂为0,暂不考虑底和指数皆为0,幂值无效的情况
  24.     else if(power == 0)
  25.         return 1;
  26.     else
  27.     {
  28.         if(abs(power) == 1)    //递归入口,先用abs()函数统一正负指数
  29.             powval = base;
  30.         if(abs(power) >= 1)    //递归结束条件
  31.             powval *= xpow(base, (abs(power) - 1)); //递归调用
  32.         if(power > 0)         
  33.             return powval;     //指数为正整数返回幂值
  34.         else
  35.             return 1/powval;   //指数为负数时返回正整数指数次幂的倒数
  36.     }
  37. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-03-26 10:59 |只看该作者
回复 1# mcmay
  1. powval = base* xpow(base, (abs(power) - 1));
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-03-26 11:06 |只看该作者
本帖最后由 txgc_wm 于 2013-03-26 11:07 编辑
  1. #include <stdio.h>
  2. #include <math.h>

  3. double xpow(double base, int power)
  4. {
  5.     double powval = 1.0;

  6.     if(base == 0)
  7.         return 0;         
  8.    
  9.     if(power == 0)
  10.         return 1;
  11.     else if(power > 0)
  12.         powval = base * xpow(base, (power - 1));
  13.     else
  14.         powval = 1/base * xpow(base, (power + 1));
  15.    
  16.      return powval;
  17. }

  18. int main(void)
  19. {
  20.     int pow;
  21.     double base, ans;

  22.     printf("Enter a number and an integer power to which the number will be raised. Enter q to quit.\n");
  23.     while(scanf("%lf%d", &base, &pow) == 2)  //输入底数和指数
  24.     {   
  25.         ans = xpow(base, pow);     //调用求幂函数
  26.         printf("\n%.3g to the power %d is %.5g\n", base, pow, ans);
  27.         printf("Enter the next pair of numbers or q to quit.\n");
  28.     }
  29.     printf("\nHope you enjoyed this power trip -- bye!\n");
  30.    
  31.     return 0;
  32. }
复制代码
以上仅供参考。

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
4 [报告]
发表于 2013-03-26 11:28 |只看该作者
用c写感觉怪怪的..
  1. (define xpow
  2.     (lambda (base power)
  3.       (define xpowi
  4.         (lambda (base power init)
  5.           (if (< power 0)
  6.               (/ 1.0 (xpowi base (- power) init))
  7.               (cond
  8.                 [(= base 0) 0]
  9.                 [(= base 1) 1]
  10.                 [(= power 0) 1]
  11.                 [(= power 1) init]
  12.                 [else
  13.                  (xpowi base (- power 1) (* init base))]))))
  14.       (xpowi base power base)))
复制代码
  1. (define xpow2
  2.     (lambda (base pwoer)
  3.       (if (< power 0)
  4.           (/ 1.0 (xpow2 base (- power)))
  5.           (cond
  6.             [(= base 0) 0]
  7.             [(= base 1) 1]
  8.             [(= power 0) 1]
  9.             [(= power 1) base]
  10.             [else
  11.              (* base (xpow2 base (- power 1)))]))))
复制代码

论坛徽章:
0
5
发表于 2013-03-26 11:42
回复 3# txgc_wm
多谢了,txgc_wm。你的解析很清楚,让知道自己的程序哪里出了问题。我没有很好地理解:幂 = 指数个底数自乘 这个概念。


   

论坛徽章:
0
6 [报告]
发表于 2013-03-26 11:43 |只看该作者
回复 4# pandaiam


    谢谢你,pandaiam。虽然我不知你的代码是哪种语言,不过原理应该是一样的。

论坛徽章:
0
7 [报告]
发表于 2013-03-26 11:44 |只看该作者
回复 2# hzy2hzy


    谢谢你,hzy2hzy。你的点睛般的指点,让我一下子明白了我的程序问题何在。

论坛徽章:
0
8 [报告]
发表于 2013-03-26 11:48 |只看该作者
回复 3# txgc_wm


  谢谢你,txgc_wm,你的解析十分详细,让我清楚了自己的程序的问题出在哪里,而且还简化了代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP