前言
说起来,我写这个系列的文章,与其说的技术文,不如说是就是自己再复习上课讲过的内容,这些题做了也有一段时间了,在复习的同时,分享一下自己的成长与学习足迹,嘛,说不定也是一代大佬的成长之路。
这次还是递归,上一篇用单个例子,这一篇就把自己做过的所有题都放上来,相对还是挺简单的,据说面试喜欢考这个?不过代码量确实是比较少的,可以了解一下。最后面也会附上一道深度的题目。
注:题目来自我们亲爱老班的OJ,若觉有不妥之地请务必联系我,我可以立马收起来......
递归(助理解的简单例题)
例题一:
题目描述
给定数字n,n的半数序列集是(1)在 n 的右边加上一个自然数,但该自然数不能超过最近添加的数的一半,这样生了新的序列;(2)按此规则进行处理,直到不能再添加自然数为止。例如,4的半数序列集是{4,4 2,4 2 1,4 1}。
输入
一个整数 n,(0<n<=50)。
输出
按照数字降序,输出集合所有序列,每个序列一行,每个数字后面跟一个空格。
样例输入
6
样例输出
6 3 1
6 3
6 2 1
6 2
6 1
6
来源
[计科老班]
先说说自己一开始的想法。题目的意思比较明显,假设一个6,往后添加一个数是3(6/2=3>=3>0),之后这里6 3作为一个结果输出,然后上一次的数变为了3,那么往3后面加的数是1(3/2=1.5;1.5>=1>0);再看别的情况6后面符合条件的数还有2(6/2=3>=2>0),以此类推,最后结果 再加上自己本身。
上一章说到过,像这种重复去生成并判断一个数后面的数是否符合要求,可以用递归来实现,而且这题跟上一题还很相像,在递归方法中都需要一个循环去执行递归,原因是能填入第二个位置的数有多个,而在填入这个数之后又将执行下一次数的填入,依然是可能有多个的,加上上面的规律来看,不难判断出我们需要的循环次数为n/2(n为输入数据);
emmm,可能说的有些混乱,毕竟能把人说懂这种操作是非常高端的。没关系,文字之间我们可能没有联系,但是我相信代码可以成为我们沟通不错的桥梁。
正文
import java.util.ArrayList;
public class Hyj1476 {
int[] result;
int n;
public Hyj1476(){
n = 6;
result = new int[n];
result[0] = n;
addNum(1,n);
System.out.println(n);
}
public void addNum(int index,int max){
for(int i=max/2;i>0;i--)
{
result[index] = i;
addNum(index+1,i);
for(int k=0;k<=index;k++)System.out.print(result[k]+" ");
System.out.println();
}
}
public static void main(String[] args){
new Hyj1476();
}
}
这里没有用if条件判断,而是直接在for循环之中输出并通过每次传进的i来判断是否到达临界条件,设置一个index下标,表示当前处于结果数组中的位置,这样当输出时就可以避免将数组后不需要的0当做输出结果。注意放在调用该方法下方输出,在递归进入最里的临界值时,若符合条件会输出,这样就能显示上面输出样例需要的格式。
网友评论