注册 登录
编程论坛 C语言论坛

初学递归错误,想不通哪地方有问题,

叶纤 发布于 2020-01-12 18:08, 3618 次点击
//额不是故意来C语言发贴的,实在是高手都来C了。。

#include<iostream>
using namespace std;
void a (int );
//(n-1)n递归
int main()
{   int n;
    cin>>n;
    a(n);
}//4 3 2 1 0
void a ( int n)
{   int b;
    if(n==0)
    {   b=1;
    }
    else
    {
        b=a(n-1)*n;//提示这地方有错
        return b;      
    }
cout << b<< endl;
}
//以下是错误信息
#1
Code
Start
prog.cc: In function 'void a(int)':
prog.cc:19:17: error: invalid operands of types 'void' and 'int' to binary 'operator*'
         b=a(n-1)*n;
           ~~~~~~^~
prog.cc:20:16: error: return-statement with a value, in function returning 'void' [-fpermissive]
         return b ;
                ^
19 回复
#2
forever742020-01-12 18:28
这个错和递归没关系
你想把a(n-1)当数来用它就得有个返回值啊
int a(int n)才是
另外,你坚持往同一个坑里面掉:
你的函数a仍然不是每个分支都有返回值。
#3
叶纤2020-01-12 18:54
我原来是按照图片用unsigned 声明函数,就是比图片多了个声明过程其他的几乎没动,可是别人可以运行起来但我的就是不行,然后我就尝试用int a(int);声明可是仍然报错
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
这是清华的一个女讲师发的一个关于递推的例题,看这个视频吐槽点挺多的,比如为啥if()后不加括号等等
#4
叶纤2020-01-12 18:56
不过她的递推思想和我差不多这就放心了,不过第一次尝试编写就遇到这事
#5
叶纤2020-01-12 18:59
算了我尝试完全用她的码看看能成功吗
#6
forever742020-01-12 19:02
if后面不带大括号正是为了让下面的return管两个分支的。
你正是因为加大括号加得不对才掉进坑里的。
#7
叶纤2020-01-12 19:13
额😓是我找错老师了
#include<iostream>
using namespace std;

unsigned fac(unsigned n)
{   unsigned f;
    if(n==0)
        f=1;
    else
        f=fac(n-1)*n,
        return f;
}
int main()
{   unsigned n;
    cout << "vhjcgbcf" << endl;
    cin >> n;
    unsigned y=fac(n);
    cout << y<< endl;
    return 0;
}
//一模一样以下是报错信息
prog.cc: In function 'unsigned int fac(unsigned int)':
prog.cc:11:9: error: expected primary-expression before 'return'
         return f;
         ^~~~~~
prog.cc:12:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
1
#8
叶纤2020-01-12 19:14


[此贴子已经被作者于2020-1-13 01:52编辑过]

#9
forever742020-01-12 19:27

该敲分号的地方你敲成逗号?
#10
叶纤2020-01-12 19:31

#include<iostream>
using namespace std;
int a (int );
//(n-1)n
int main()
{   int n;
    cin>>n;
    a(n);
    cout<<a(n);

}//4 3 2 1 0
int a ( int n)
{   int b;
    if(n==0)
    {   b=1;
    }
    else {
        b=n*a(n-1);}
        return b ;       //b在这里返回给int b,然后再进行ifelse循环这样才有返回值因为还有1的情况
   
}


[此贴子已经被作者于2020-1-13 01:38编辑过]

#11
叶纤2020-01-12 19:43
回复 9楼 forever74
大神( ゚皿゚)你真是一针见血,一个逗号都能找的到,厉害厉害,然后我把逗号改成分号呀成功运行了
不过会出现报警prog.cc: In function 'unsigned int fac(unsigned int)':
prog.cc:9:5: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
     else
     ^~~~
prog.cc:11:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
         return f;
         ^~~~~~
vhjcgbcf
6
0

这个是我的报警
prog.cc: In function 'int a(int)':
prog.cc:22:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
6
0
#12
momotianxin2020-01-13 11:43
先看代码
#include<iostream>
using namespace std;
void a (int );
//(n-1)n递归
int main()
{   int n;
    cin>>n;
    a(n);
}//4 3 2 1 0
void a ( int n)//第一处
{   int b;
    if(n==0)//第四处
    {   b=1;
    //return b;  第三处
    }
    else
    {
        b=a(n-1)*n;//提示这地方有错
        return b;      //第二处
    }
cout << b<< endl;
}






#13
momotianxin2020-01-13 11:44
回复 12楼 momotianxin
有毒吧,剩下的话发表不出来了
#14
momotianxin2020-01-13 11:44
回复 12楼 momotianxin
emm.....就我所理解的来说吧:
首先,第一处 ,为什么大家都不建议取a等单个字母为函数名,我觉得其一,如果在一个文件内出现了全局变量a等情况,和你这个函数名冲突了。你可以去看下,编程规范,比如华为编程规范,这样你就可以避免很多语法格式错误。
#15
momotianxin2020-01-13 11:45
回复 14楼 momotianxin
其次,第二处,既然你是用递归方法,我的理解递归就是 在运算时是一个循环,等循环到了一个节点,然后就退出,也就是说,你这代码会一直不停的调用,违反了有穷性;我第三,建议将第三处的代码放到第二处。
第四,还有楼上所说,函数的返回值类型要对应一致;
第五, 如果考虑编译器问题 if(n==0) 建议写成if(0==n)
#16
momotianxin2020-01-13 11:45
回复 15楼 momotianxin
还得分开发
#17
momotianxin2020-01-13 11:45
回复 15楼 momotianxin
有所不对,还请指教
#18
叶纤2020-01-13 11:54
回复 12楼 momotianxin
#include<iostream>
using namespace std;
int a (int );
//(n-1)n
int main()
{   int n;
    cin>>n;
  a(n);
    cout<<a(n);

}//4 3 2 1 0
int a ( int n)
{  
    int b;
    if(n==0)
    {   b=1;
    }
    else
       { b=n*a(n-1);}
        return b ;      
   
}
这里已经被改正,不过有了新的疑问。
为什么别人可以用void  fun(int   a);来声明函数而我这里把int a(int n)  变成void a(int n)会大量报错?
#19
叶纤2020-01-13 12:06
变量命名规则我写的确实不规范,很容易被误解为i,j。曾经看过一个文章说外国人都把i j等大部分是用在for循环中,如果用在其他地方会造成误解,还有变量名取读音相同的也不好,因为在讨论的时候很容易被误解,因为我现在是初学阶段是在学习思想的一个过程,所以确实变量命名不怎能规范,也感谢您的提醒
#20
叶纤2020-01-13 12:13
回复 15楼 momotianxin
你说的把n==0,变成0==n在递推中最后不要这么用,我也是查过资料的,具体原因我也迷糊不清,不过文章说不要这么用
1