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