递归函数最终会结束,那么这个函数一定?
A 使用了局部变量
B 有一个分支不调用自身
C 使用了全局变量或者使用了一个或多个参数
D 没有循环调用
解析:B
只有一次循环满足某个条件,不调用自己就返回,递归才会一层一层向上返回。
那么C呢,想一下,全局变量和参数确实可以用来控制递归的结束与否。
该不该选C呢?再仔细看一下题目(说实话,我很讨厌这种文字游戏),“这个函数一定…“,所以,问题集中在,是否是一定会使用这两种方式呢? 显然不是的。
除了C中提到的两种情况外,还有如下控制递归的方式:
- 局部静态变量是可以控制递归函数最终结束的 2. 可能通过异常来控制递归的结束。 3. 可以利用BIOS或OS的一些数据或一些标准库的全局值来控制递归过程的
终止。 4. 可以把一些数据写入到BIOS或OS的系统数据区,也可以把数据写入到一个文件中,以此来控制递归函数的终止。
所以,答案为B
已知二叉树后序遍历序列是bfegcda,中序遍历序列是badefcg,它的前序遍历序列是:
A abcdefg
B abdcefg
C adbcfeg
D abecdfg
解析:后序遍历中的最后一个元素是根节点,a,然后查找中序中a的位置,把中序遍历分成
b a defcg,易知左子树为b,右子树为defcg,再递归求解,可画出原始二叉树,故知前序遍历序列为B。
【汽水瓶】
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
if (n==0){
break;
}
System.out.println(Drink(n));
}
}
public static int Drink ( int n ) {
int ret = 0;
while (n>= 3){
int a = n/3 ;
ret += a;
n = a+ n%3;
}
if (n==2){
ret += 1 ;
}
return ret;
}
}
查找两个字符串a,b中的最长公共子串
动态规划求解,dp[i][j]记录字符串s1前i个字符和字符串s2前j个字符的最长子串的长度,初始化所有值为0。
当s1.charAt(i-1)==s2.charAt(j-1) 时,dp[i][j] = dp[i-1][j-1]+1 公共子串长度加一; 记录最长的长度和最后一个字符的位置,即可求解。
import java.util.Scanner;
public class Main2{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.nextLine();
String str2 = sc.nextLine();
System.out.println(getString(str1,str2));
}
public static String getString(String s1 , String s2){
int m = s1.length();
int n = s2.length();
int maxLen = 0 , pos = -1;
int [][] dp = new int[m+1][n+1];
for (int i = 1; i < m+1; i++) {
for (int j = 1; j <n+1 ; j++) {
if ( s1.charAt(i-1)==s2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
if ( dp[i][j]>maxLen){
maxLen = dp[i][j];
pos = i -1;
}
} else {
dp[i][j]=0;
}
}
}
if ( maxLen != 0){
return s1.substring(pos-maxLen+1,pos+1);
}
return null;
}
}