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

递归函数可以用unsigned longlong fun(unsigned longlong)来声明吗

叶纤 发布于 2020-01-14 17:14, 2326 次点击
https://bbs.bccn.net/thread-498917-1-1.html
我用递归做这个题目因为我不确定可不可以用unsigned longlong fun(unsigned longlong)声明
只敢用int fun(int)声明,不过数字一输入大比如1-1000就运行的超慢的
#include<iostream>
using namespace std;
int a (int );//递归b-n公差为三的数字
int d(int);//递归b-n
int main()
{   int b;
    int n;
    n>b;//规定n到b的范围
    int count=0;
    cin >> b>>n;
    for(int i=1; i<=n; ++i)
    {   if(a(i)%3==1&&d(i)%3==1)//计算b-n不能被3整除的
        {   ++count;
        }
    }
    cout << n-count<< endl;//计算可以被三整除的
}
//13313313
int a (int n)//递归b-n公差为三的数字
{
    int t;
    //int count=0;
    //int countnum=0;
    if(n==1)
    {   t=1;
    }
    else
    {
        t=a(n-1)+3;
    }
    return t;
}
int d(int n)
{
    if(n!=0)
    {   d(n-1);
    }

    return n;
}
7 回复
#2
forever742020-01-14 18:36
首先,函数是可以声明为unsigned long long fun(unsigned long long);的。
其次,这和函数是否递归没有关系。
第三,循环能解决的问题,递归不能提高运行效率。
第四,由于栈空间无论大小,一定是很有限的,决定了递归层数不能过多。但是具体多少才是过多这个取决于硬件、操作系统、编译器和算法复杂程度。
第五,题外,楼主你要是感兴趣递归,就去琢磨一下汉诺塔、八皇后好了。
#3
叶纤2020-01-14 18:43
突然感觉我的代码好啰嗦,改改,用for循环可以做到1 1000000000
#include<iostream>
using namespace std;
int main()
{int b;
    int n;
    n>b;//规定n到b的范围
    int count=0;
    cin >> b>>n;
    for(int i=1; i<=n; ++i)
    {if(i%3==1)
    {++count;}
    }
   cout << n-count<< endl;
return 0;
}
#4
叶纤2020-01-14 18:45
递归和for循环没区别啊,我都是当for循环用的,好像递归的内存大点
#5
叶纤2020-01-14 18:50
感觉用法差不多,就是比for循环多个步骤
#include<iostream>
using namespace std;
int d(int);//递归b-n
int main()
{   int b;
    int n;
    n>b;//规定n到b的范围
    int count=0;
    cin >> b>>n;
    for(int i=1; i<=n; ++i)
    {   if(d(i)%3==1)//计算b-n不能被3整除的
        {   ++count;
        }
    }
    cout << n-count<< endl;//计算可以被三整除的
}
int d(int n)
{
    if(n!=0)
    {   d(n-1);
    }
    return n;
}
#6
叶纤2020-01-14 18:54
谢谢大大,听你这讲解明白了,我以后会慎用递归的
#7
forever742020-01-14 19:26
算法书上说,尾递归可以等价改写为循环。那就是说,非尾递归不行。
所以让你理解一下汉诺塔,看看循环是怎么无能为力的。
#8
叶纤2020-01-14 19:37
回复 7楼 forever74
谢谢大大,我尝试尝试写写汉诺塔
1