作业帮 > 数学 > 作业

按要求设计递归算法.只需写出伪代码或画流程图,不需语言实现,但算法必须完整清晰.

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:数学作业 时间:2024/08/05 18:57:30
按要求设计递归算法.只需写出伪代码或画流程图,不需语言实现,但算法必须完整清晰.
以递归算法生成以下整数数组,每组包含四个元素,第一个元素(序号为0)都为0,往后是所有以3或4连续相加的可能情况,生成后以序号靠前的元素的大小从小到大排序.
输出示例:[0,3,6,9],[0,4,7,10],[0,4,8,11] ...→排序→[0,3,6,9],[0,3,6,10],[0,3,7,10],[0,3,7,11] .
不要求语言实现,只需写出伪代码或画出流程图,但算法必须完整清晰.伪代码必须包含算法结构用词,如 (不限于也可以不用) while for else等,if和end if等需要标记清楚.
按要求设计递归算法.只需写出伪代码或画流程图,不需语言实现,但算法必须完整清晰.
arrs[100000][100000];
a[100000];
f(i,zhi){
if(i==4){
arrs[]=a;
return;
}
a[i]=zhi;
f(i+1,zhi+3);
f(i+1,zhi+4);
}
f(0,0)
arrs就是结果,并且是排了序的.
再问: 谢谢解答,但这种方法看的不太明白,可能比较抽象,不懂这里面循环体是哪里开始哪里结束,f()的调用是怎样实现生成和排序的。能否用do for while等方法的语言大概是Java的格式再写一遍伪代码或者解释下为什么是这样的呢?
再答: java代码就不用写了,你的问题是不懂什么情况使用递归,怎样的逻辑才算递归。
如果我求得固定第一位后的数组,那么全部数组就可以求出
如果我求得固定第二位后的数组,固定第一位后的数组就可以求出,固定第二位有两种可能
。。。
如果我求得固定第四位后的数组,固定第三位后的数组就可以求出,固定第四位有两种可能
这很明显是递归的算法。
arrs[100000][100000];
a[100000];
f(i,zhi){//i是数组个数,zhi是每一位要确定的值
if(i==4){//说明数组个数是4了,完成了
arrs[]=a;//将数组赋给另外一个大数组
return;
}
a[i]=zhi;//确定i位的值
f(i+1,zhi+3);//求得确定i位后,i+1的值为zhi+3的所有数组
f(i+1,zhi+4);//求得确定i位后,i+1的值为zhi+4的所有数组
//上两步的总和就是确定i位后的全部数组
}
f(0,0)
再问: 谢谢,明白了一些。哪里要用递归过程是理解的,但就是不太能理解这个伪代码是在做些什么,跟题目要求的输出示例有什么联系。好像这里还没有包括到确定每个元素的值的过程呢。

用C或者其它语言也可以,能否做出代码来呢?或许这样就全都理解了。会有追加分的。
再答: 你想通过代码找出别人的思路,而不是根据思路来理解别人的代码,这个方向是错误的。即使给你几天弄懂了代码,但是,你还是不懂递归的,如果再遇到无限极分类,全排列,八皇后,汉诺塔等这些问题时,你还是迷糊的。

而先知道递归思路,写出代码是很容易很容易的事,如果自己都没有思路,看了也是白看。递归思路怎样获得呢,谭浩强已经说的很明白了,就是不断将问题分解,也就是先整体,后局部,局部又可按照整体的划分法。例如这道题就是将求数组的集合这个问题不断分解,先分解为求得固定第1位的集合,然后分解为固定第2位的集合。。。我都说的很明白嘛。你自己首先要认同这个思路,然后再将这个思路和代码结合起来。你还是先看看汉诺塔问题或者全排列问题先吧。
其次,这代码和java,c没什么不同,就这句arrs[]=不同,我是用php写的。a[i]=zhi;这句不就是确定值吗?

最后,那个函数将所有结果都保存在arrs中了,难道你不会输出一个数组吗?