题目10分析:(斐波那契数列)
斐波那契数列的实现递归思路:
1.递归调用函数
循环思路:
1.从i=2开始循环,f(i)=上次的值+上上次的值
2.保存当前值和上次的值
#include <iostream> using namespace std; long long fibonacci_digui(int n) { int result[] = { 0,1 }; if (n<2) return result[n]; return fibonacci_digui(n - 1) + fibonacci_digui(n - 2); } long long fibonacci_for(int n) { int result[] = { 0,1 }; if(n<2) return result[n]; int last_result = result[1]; int last_last_result = result[0]; int cur_result = 0; for (int i = 2; i <= n; i++) { cur_result = last_result + last_last_result; last_last_result = last_result; last_result = cur_result; } return cur_result; } void main() { int result; int n; cout << "输入n:"; cin >> n; cout << "递归计算的结果:" << fibonacci_digui(n) << endl << "循环计算的结果:" << fibonacci_for(n) << endl; }
题目11分析:(旋转数组的最小数字)
输入旋转数组,第一子数组最后一个元素和第二子数组第一个元素相邻,且第二个子数组第一个元素最小,可利用二分查找或者顺序查找获得中间元素,若中间元素大于p1对应元素,则在第一数组中,将p1指向中间元素;若中间元素小于p2,
则在第二数组中,将p2指向中间元素。
思路:
1.初始化p1指向第一个元素,p2指向最后一个元素, mid指向第一个元素
2.轮询p1指向元素大于p2指向元素,直至p2-p1=1
3.计算中间下标
4.若p1,p2,中间下标对应元素都相同,则使用顺序查找获得第二数组的第一个元素
5.若中间下标对应元素大于p1对应元素,则p1指向中间元素
6.若中间下标对应元素小于p2对应元素,则p2指向中间元素
#include <iostream> using namespace std; //顺序查找 int order_find(int *arr, int p1, int p2) { int result = arr[p1]; for (int i = p1 + 1; i <= p2; i++)//第一个数组第一个元素大于第二个数组第一个元素 { if (result > arr[i])//获得最小值 result = arr[i]; } return result; } int rotate_min(int *arr, int length) { if (arr == NULL&&length <= 0) throw new exception("invalid arr!"); //1.初始化p1指向第一个元素,p2指向最后一个元素, mid指向第一个元素 int p1 = 0; int p2 = length - 1; int mid = p1; while (arr[p1] >= arr[p2]) { //2.轮询p1指向元素大于p2指向元素,直至p2-p1=1 if ((p2 - p1) == 1) { mid = p2; break; } //3.计算中间下标 mid = (p2 + p1) / 2; //4.若p1,p2,中间下标对应元素都相同,则使用顺序查找获得第二数组的第一个元素 if (arr[p1] == arr[p2] && arr[p1] == arr[mid]) return order_find(arr, p1, p2); //5.若中间下标对应元素大于p1对应元素,则p1指向中间元素 if (arr[mid >= arr[p1]]) p1 = mid; //6.若中间下标对应元素小于p2对应元素,则p2指向中间元素 else if (arr[mid] <= arr[p2]) p2 = mid; } return arr[mid]; } void main() { int arr[] = { 3,4,5,1,2 }; int length = sizeof(arr) / sizeof(arr[0]); int result; result = rotate_min(arr, length); cout << "旋转数组最小值:" << result << endl; }