程序基本算法习题解析 写出在Fibonacci数组A中查找特定值的二分查找过程。

本文介绍了一种使用二分查找算法在特定排序数组(即第2至第10个Fibonacci数构成的数组)中查找指定数值的方法。通过详细解释查找流程并提供实际代码实现,展示了如何高效地确定目标数值是否存在于数组中及其位置。
摘要由CSDN通过智能技术生成

书上原题目为:

数组A含有9个元素,这些元素恰好是第2至第10个Fibonacci数,写出在数组A中查找x=17的二分查找过程。

Fibonacci数列的递推公式为:

F(n)=\left\{\begin{matrix} 1, &n=0 \\ 1,& n=1\\ F(n-1)+F(n-2)&,n>1 \end{matrix}\right.

前10个Fibonacci数为:

1 1 2 3 5 8 13 21 34 55  

因此数组A为:

1 2 3 5 8 13 21 34 55

从数组中可以看到,x=17并不在数组中。而且我觉得让用户输入需要查询的数字会更灵活。因此写了如下程序:

// Chapter7_4.cpp : Defines the entry point for the application.
// 数组A含有9个元素,这些元素恰好是第2至第10个Fibonacci数,
// 写出在数组A中查找x=?的二分查找过程。

#include "stdafx.h"
#include<iostream>
using namespace std;

const int N = 10;
//查找函数
//已经从小到大排好序的前提下
//参数分别为:需要查找的数组,查找初始位置,查找结束位置,查找的数字
int funSearch(int arr[],int Begin,int End,int x)
{
	//二分到只剩一个数字
	if(Begin == End)
	{
		//当查找的数字在数组中时
		if(arr[Begin] == x)
			return Begin+1;
		else
		{
			cout << x << " is not in the array!" << endl;
			return -1;
		}
	}
	else
	{
		//如果查找的数字在后半部分
		if(arr[(Begin+End)/2] < x)
			Begin = (Begin+End)/2+1;
		//如果查找的数字在后半部分
		else
			End = (Begin+End)/2;
		return funSearch(arr,Begin,End,x);
	}
}
int main()
{
	int arr[N],i,position;
	int x;
	//求Fibonacci数列
	arr[0] = 1;
	arr[1] = 1;
	for(i=2;i<N;i++)
		arr[i] = arr[i-1]+arr[i-2];
	//输出Fibonacci数组中前10个元素
	cout << "前" << N << "个Fibonacci数为:" << endl;
	for(i=0;i<N;i++)
		cout << arr[i] << ' '; 
	cout << endl;
	//输出数组A中的元素
	cout << "数组A中的元素为:" << endl;
	for(i=1;i<N;i++)
		cout << arr[i] << ' '; 
	cout << endl;
	//用户输入想查找的数字
	cout << "input the number you want to search: ";
	cin >> x;
	//调用函数求位置
	position = funSearch(arr,0,N-1,x) - 1; //减1是因为用Fibonacci数组进行计算的,A数组相应的要减1
	cout << x << " is in the " << position << "th number." << endl;  
	system("pause");
	return 0;
}

运行结果如下:

虽然17不在数组中,但还是输出了  17 is in the -2th number. 。这是因为没有查找到时会返回-1,因此,输出角标为负可以不用管。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值