关于递归的运行错误问题

joykerl 2014-11-11 06:18:44
#include <stdio.h>

long Power_loop (int m,int n)
{
long j;
for (n = 1;n <= 3;n++){
j = m * n;
}
return j;
}

long PowerRecursive (int a,long b)
{
if (a < 0)return -1;
return PowerRecursive(a,b-1) * a;
}
int main(void)
{
printf("loop = %ld\n",Power_loop(2,3));
printf("Recursive = %ld\n",PowerRecursive(2,3));
return 0;
}


我写了一个循环,一个递归的函数进行输出,功能和结果是一样,但是为什么递归那个输出结果不对呢?输出结果是:

loop = 6
Segmentation fault: 11 ---------这个结果让人很郁闷,怎么不是6呢?

麻烦大家帮一下,谢谢了
...全文
286 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
joykerl 2014-11-13
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
了解基本工作原理和主要递归因素,从这个帖子不但解决了问题,还更深入理解递归函数的运用了,谢谢你!
joykerl 2014-11-13
  • 打赏
  • 举报
回复
引用 3 楼 u013163178 的回复:
你这哪里是求阶乘啊,你是求m的n次幂
#include <stdio.h>

long Power_loop (int m,int n)
{
    long result = 1;
    for (int i = 1; i <= n;i++){
        result *= m;
    }
    return result;
}

long PowerRecursive (int a,int b)
{
    if (b > 1)//改这里
        return PowerRecursive(a,b-1) * a;
    else
        return a;//改这里
    
}
int main(void)
{
    printf("loop = %ld\n",Power_loop(9,8));
    printf("Recursive = %ld\n",PowerRecursive(9,8));
    return 0;
}
如果是求阶乘的话,就该这么写啊
#include<stdio.h>
int f(int n)
{
	if(n == 1 || n == 2)
	return n;
	else
	return f(n-1)*n;
}

int main()
{
	int n;
	scanf("%d",&n);
	printf("%d",f(5));
	return 0;
}
感谢,您用两个例子让我更清晰了解我的练习题的问题了,确实算的是次幂,只是用了递归的思想去完成。
赵4老师 2014-11-12
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
自信男孩 2014-11-11
  • 打赏
  • 举报
回复
递归没有退出条件,即没有对b值的边界没有判断,所以会一直递归下去。另外,递归函数会不断申请函数栈空间,死循环会造成栈溢出,所以会有段错误。
「已注销」 2014-11-11
  • 打赏
  • 举报
回复
你这哪里是求阶乘啊,你是求m的n次幂
#include <stdio.h>

long Power_loop (int m,int n)
{
    long result = 1;
    for (int i = 1; i <= n;i++){
        result *= m;
    }
    return result;
}

long PowerRecursive (int a,int b)
{
    if (b > 1)//改这里
        return PowerRecursive(a,b-1) * a;
    else
        return a;//改这里
    
}
int main(void)
{
    printf("loop = %ld\n",Power_loop(9,8));
    printf("Recursive = %ld\n",PowerRecursive(9,8));
    return 0;
}
如果是求阶乘的话,就该这么写啊
#include<stdio.h>
int f(int n)
{
	if(n == 1 || n == 2)
	return n;
	else
	return f(n-1)*n;
}

int main()
{
	int n;
	scanf("%d",&n);
	printf("%d",f(5));
	return 0;
}
joykerl 2014-11-11
  • 打赏
  • 举报
回复
引用 1 楼 wufeng55 的回复:
你的程序有问题啊,递归的函数是个死递归,a的值不变,只是b的值一直在变化,函数里的if语句执行不了,怎么能return呢?
你好,程序确实有问题,我已经修改好了。这个程序算的是一个数的阶乘,所以a的值是一直不变的 修改后正确的应该是这样的:
#include <stdio.h>

long Power_loop (int m,int n)
{
    long result = 1;
    for (int i = 1; i <= n;i++){
        result *= m;
    }
    return result;
}

long PowerRecursive (int a,int b)
{
    if (b > 0)
        return PowerRecursive(a,b-1) * a;
    else
        return 1;
    
}
int main(void)
{
    printf("loop = %ld\n",Power_loop(9,8));
    printf("Recursive = %ld\n",PowerRecursive(9,8));
    return 0;
}
code小生 2014-11-11
  • 打赏
  • 举报
回复
你的程序有问题啊,递归的函数是个死递归,a的值不变,只是b的值一直在变化,函数里的if语句执行不了,怎么能return呢?

70,034

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧