这些是我在训练递归时遇到的一些疑惑,我现在图片展示的这个算法是正确的,但是当输入的k过大时就会导致内存爆掉,我正在想办法用动态数组解决,想了一天一夜多实在不会了。
除此之外还有几个问题,希望可以得到解答
问题1:如何用动态数组来完善我这个算法思路。
问题2:char *s1="hello"这样定义出来的字符串不能修改,所以我只好把一开始的字符串定义成 char s1[]="a";这样却导致我后来发现内存不够用后不会把malloc这个东西套进来,不会初始化字符串以及修改字符串了,我对malloc这个东西的用法不太熟悉,感觉使用指针来用malloc和修改字符串这两个事件从性质上冲突了,请解惑
问题3:递归的本质就是重复调用一个函数,为了达成重复调用的效果,我只能把指针设置在function2里面,因为如果设置在主函数里好像无法递归,只能主函数里是字符数组,调用函数里指针指过去,这样调用函数运行结束后才能把字符串的内容保存下来,而且因为我只会把指针设置在被调用的函数里,导致我后来试着用malloc改良的时候也只能把malloc放在被调用函数里面,好像是因为malloc只能用在指针里面?这是我本人粗略的理解,请指正
问题4:想要知道更多关于c语言字符串的细节知识,尤其是开发过程中容易踩坑的细节,上面几个问题本质上来说就是我一个初学者对malloc和字符串的一些性质不了解而且没办法自己想明白
本人qq2328714837,我想学到更多有用相关的知识,并愿意支付额外报酬
这题没必要用指针
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
LL f[50]={1},g[50]={1},k;
LL ans(int now,LL kk)
{
if(kk>=f[now])
return g[now];
if(kk<=now)
return 0;
return ans(now-1,kk-1)+min(max(0ll,kk-1-f[now-1]),LL(now))+ans(now-1,kk-1-f[now-1]-now);
}
int main()
{
for(int i=1;i<=40;i++)
f[i]=f[i-1]<<1,f[i]+=2+i,g[i]=g[i-1]*2+i;
scanf("%d%lld",&n,&k);
cout<<ans(n,k);
return 0;
}
数组得长度是固定的,如果是全局的数组变量,数据是放在程序的数据区,存放在可执行文件里边,这个长度可以很大。局部数组放在程序的栈空间,栈空间是固定大小的,当然这个大小可以自己设置,VS编译器默认是4M,如果局部数组过大,或者函数递归深度过大,栈就不够了,程序就崩溃了,不一定是算法的问题。动态分配内存,储存空间在堆空间,堆空间你可以认为是内存条里边剩余的内存,是很大的空间。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!