C 在'中实现印第安算法;while循环';。我做错了什么?

C 在'中实现印第安算法;while循环';。我做错了什么?,c,recursion,C,Recursion,我被告知在while循环中实现函数,而不是递归函数。到目前为止,我总是得到错误的答案。任何关于我在哪里犯了错误的指示都将不胜感激。 我试图计算2^12,但到目前为止,每当我运行程序时,它都会给我4。我创建这个线程的最初问题已经解决了。但是我有一个新问题,它与前一个问题相关,但需要一个不同的方法 #include <stdio.h> double powerloop(double x, int y, double help) { while(y!=0) { if

我被告知在while循环中实现函数,而不是递归函数。到目前为止,我总是得到错误的答案。任何关于我在哪里犯了错误的指示都将不胜感激。 我试图计算2^12,但到目前为止,每当我运行程序时,它都会给我4。我创建这个线程的最初问题已经解决了。但是我有一个新问题,它与前一个问题相关,但需要一个不同的方法

#include <stdio.h>

double powerloop(double x, int y, double help)
{
   while(y!=0)
   {
     if((y%2)==0)
     {
        x=x*x;
        y=y/2;
     }

     if((y%2)==1)
     {
        help=help*x;
        x=x*x;
        y=(y-1)/2;
     }

     if(y==1)
     {
       x=x*help;
     }

     return x;
  }
}

int main(void){
     printf("Using powerloop to calculate 2^12: %f \n", powerloop(2, 12, 1));
     return 0;
}
#包括
双电源环路(双x、双y、双帮助)
{
而(y!=0)
{
如果((y%2)==0)
{
x=x*x;
y=y/2;
}
如果((y%2)==1)
{
帮助=帮助*x;
x=x*x;
y=(y-1)/2;
}
如果(y==1)
{
x=x*帮助;
}
返回x;
}
}
内部主(空){
printf(“使用powerloop计算2^12:%f\n”,powerloop(2,12,1));
返回0;
}
两个问题:

1.以下测试错误:

if(y & 2 == 0)
你想要

if((y % 2) == 0)
模%运算符与对2执行“按位and”运算不同

2.初始行

 double num=power(x, y/2); 
导致堆栈溢出。在VisualC++中,它也给了我一个明确的警告:“C47 17:‘功率’:所有控制路径的递归”

递归总是绝对地需要一个结束条件,在那里is停止

在power()中要做的第一件事是一次又一次地调用power(),一次又一次,…,一次又一次:

double power(double x, int y) { 
    double num=power(x, y/2);    // <- call myself again forever
    // other code
 }
两个问题:

1.以下测试错误:

if(y & 2 == 0)
你想要

if((y % 2) == 0)
模%运算符与对2执行“按位and”运算不同

2.初始行

 double num=power(x, y/2); 
导致堆栈溢出。在VisualC++中,它也给了我一个明确的警告:“C47 17:‘功率’:所有控制路径的递归”

递归总是绝对地需要一个结束条件,在那里is停止

在power()中要做的第一件事是一次又一次地调用power(),一次又一次,…,一次又一次:

double power(double x, int y) { 
    double num=power(x, y/2);    // <- call myself again forever
    // other code
 }

你有无限递归吗

double power(double x, int y) { 
    double num=power(x, y/2); 
    /* .... */
 }

power()将无条件地调用自身。我没有检查算法本身,但您需要在那里进行一些检查…

您有无限递归

double power(double x, int y) { 
    double num=power(x, y/2); 
    /* .... */
 }

power()将无条件地调用自身。我没有检查算法本身,但您需要进行一些检查…

毫无疑问,您正在遭受堆栈溢出

台词:

double power(double x, int y)
{
   double num=power(x, y/2);
导致
power
调用
power
调用
power
调用
power
。。。再也没有机会回来了

每次调用函数时,返回地址都会被推送到堆栈上。如果继续这样做,并且没有
从堆栈返回
s到pop地址,那么最终会耗尽空间并得到segfault


此递归算法缺少的是终止条件,即执行的代码路径不会导致递归路径。

毫无疑问,您正在遭受堆栈溢出

台词:

double power(double x, int y)
{
   double num=power(x, y/2);
导致
power
调用
power
调用
power
调用
power
。。。再也没有机会回来了

每次调用函数时,返回地址都会被推送到堆栈上。如果继续这样做,并且没有
从堆栈返回
s到pop地址,那么最终会耗尽空间并得到segfault

这个递归算法缺少的是终止条件,即执行的代码路径不会产生递归路径。

假设您调用power(3.0,10)

函数所做的第一件事是调用power(3.0,5)

call做的第一件事就是调用power(3.0,2)

call做的第一件事就是调用power(3.0,1)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

几百万个电话之后,你会得到一个“分段错误”

假设你称之为力量(3.0,10)

函数所做的第一件事是调用power(3.0,5)

call做的第一件事就是调用power(3.0,2)

call做的第一件事就是调用power(3.0,1)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)

call做的第一件事就是调用power(3.0,0)


几百万个电话之后,你会得到一个“分段错误”

您的
返回x
应该在最后一个
if
语句的范围内。

您的
返回x
应该在最后一个
if
语句的范围内。

您能确切地告诉我们问题是什么吗?输出是否不是您所期望的?它会崩溃吗?它是否会在你的脑海中留下危险的想法?如果你能给我们提供更多的细节,我们可能会帮你更好一点。每当我试图执行它时,终端总是告诉我“分段错误(核心转储)”。本程序的目的是提供一种使用印第安算法计算x^y的有效方法。对不起。在这一点上,我要放弃了。是的,我没有堆栈和线程。不确定这意味着什么,尽管您现在已经编辑了问题,以便所有原始错误的痕迹都消失了。让它变得毫无用处。。。不是吗。投票结束。你能告诉我们到底是什么问题吗?输出是否不是您所期望的?是cr吗