两种方法:递归和动态规划,针对此题目,递归较之动态规划会好点
方法一:递归
public class ofo {
public static void main(String[] args) {
int n=31;
System.out.println(f(n));
}
private static int f(int n) {
if(n==2) return 1;
if(n==1) return 0;
if(n%2==0){
return f(n>>1)+1;
}
else{
return Math.min(f(n-1)+1, f(n+1)+1);
}
}
}
方法二:动态规划题
public class ofo {
public static void main(String[] args) {
int n=31;
int [] res=new int[n+1];
res[1]=0;
for(int i=2;i<=n;i++){
if(i%2==0){
res[i]=res[i>>1]+1;
}else{
int a=res[i-1]+1;
int b=res[(i+1)>>1]+2;
res[i]=Math.min(a,b);
}
}
System.out.println(res[n]);
}
}