递归法:走楼梯; 旋转数组的最小数字

题目:走楼梯
小明在走楼梯,楼梯有n阶台阶,一次可以上1阶,2阶或者3阶,实现一个方法,计算小明有多少种走楼梯的方式
在这里插入图片描述

package louti;
import java.util.Scanner;

public class Floor {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);   //接受键盘输入的数据
		while (true) {
			int n=sc.nextInt();
			int res=f(n);
			System.out.println(res);
		}
	}
	private static int f(int n) {
		if(n==0) return 1;
		if(n==1) return 1;
		if(n==2) return 2;
		return f(n-1)+f(n-2)+f(n-3);  //递归,缩小n
	}
}

c++

#include<iostream>
using namespace std;
 
	static int f(int n) {
		if(n==0) return 1;
		if(n==1) return 1;
		if(n==2) return 2;
		return f(n-1)+f(n-2)+f(n-3);  //递归,缩小n
	}
int main(){
	int n,res;
		cin>>n;   //接受键盘输入的数据
		while (true) {
			int res=f(n);
			cout<<res<<endl;
			cout<<endl;
		}
		return 0;
	}

改造的二分法
题目:旋转数组的最小数字
把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的旋转,该数组的最小值为1
在这里插入图片描述
代码思想;

 static int min(int[] arr){
 	int begin=0;
 	int end=arr.length-1;   //考虑没有旋转这种情况 
 	if(arr[begin]<arr[end])  //如果数组前面的元素小于后面的数组 
 	return arr[begin];
 	while (begin+1<end){   //begin和end指向相邻元素 
 		int mid=begin+((end-begin>>1);  //要么左侧有序,要么右侧有序 
 		if(arr[mid]>=arr[begin]){  //左侧有序 
 			begin=mid;
		 }
		 else=mid;
	 }
 }
 return 0;
 int main() {
 	int[] arr={5,1,2,3,4};
 	int res=min(arr);
 	Assertions.assertThat(res).isEqualTo(1);  //输出最小元素 
 	arr=new int[]{2,3,4,5,6};
 }
发布了107 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/104395471