找数字(递归,二分查找)

题目:在一从大到小排序的序列中用递归找一个数在不在这序列,在输出yes,不在输出no

这题用了二分查找的递归实现

思路:

把数组和变量都变成全局变量方便递归函数修改

然后如果不可能就跳出循环

如果可能但现在没找到就缩小范围进入下一个递归过程

如果找到了就输出

代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000];
int n,key;

int finder(int l,int r)//左和右
{
    if(l>r)
    {
        cout<<"no"<<endl;
        return 0;
    }
    int mid=(l+r)/2;
    if(a[mid]<key)
    {
        finder(l,mid-1);

    }
    else if(a[mid]>key)
    {
        finder(mid+1,r);

    }
    else
    {
        cout<<"yes"<<endl;
        return 0;
    }

}
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n>>key;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    finder(1,n);
    return 0;
}

原文地址:https://www.cnblogs.com/zyacmer/p/10046973.html

时间: 2024-10-11 08:00:08

找数字(递归,二分查找)的相关文章

冒泡排序,递归二分查找法,二分查找法

#冒泡排序list1=[2,4,5,6,7,8,9,11,30,35,38,41,42] def bubble_sort(list): for i in range(len(list)-1): for j in range(len(list)-1-i): if list[j]>list[j+1]: list[j],list[j+1]=list[j+1],list[j] print(list) list1=[2,4,55,6,78,38,95,11,30,35,38,41,42] bubble_s

算法前戏 递归 二分查找 列表查找

一.递归 概念: 函数直接或者间接的调用自身算法的过程,则该函数称为递归函数.在计算机编写程序中,递归算法对解决一大类问题是十分有效的. 特点: ①递归就是在过程或者函数里调用自身. ②在使用递归策略时,必须有一个明显的结束条件,称为递归出口.问题规模相比上次递归有所减少, ③递归算法解题通常显得很简洁,但递归算法解题的效率较低.所以一般不倡导使用递归算法设计程序. ④在递归调用的过程当中系统的每一层的返回点.局部变量等开辟了栈来存储.递归函数次数过多容易造成栈溢出等. 所以一般不倡导用递归算法

用递归要小心---以递归二分查找为例

昨天面试的时候被问了好多问题,今天再做,有些部分竟然连起来了:二分查找.递归.局部变量静态变量(静态局部变量),可能还有更多,待我慢慢总结.. OK进入正题. 一. 首先 写个二分查找的函数.因为之前只是了解过这个算法,实际自己写还没写过,想了想,如果不用递归,一时没啥思路,那就用递归吧 // This is v0.1 and there may be errors. #include <stdio.h> int binary_search(int a[], int left, int rig

usaco No Change, 2013 Nov 不找零(二分查找+状压dp)

Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上只有 K 张消费卡,第 i 张卡里有 Vi 元余额. 问题是,这些消费卡都是一次性的,它们可以被收银机读取,但如果卡一旦离开了收银机,卡里 的余额就会归零,而且超市也不负责找零!奶牛的队伍很长,不可能再调整她们的位置了,所以一张 卡只能支付一段连在一起的账单.而且,一张账单只能用一张消费卡支付,超

LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)

题意:有一个有序序列A,其内部可能有部分被旋转了,比如A[1...n]被转成A[mid...n]+A[1...mid-1],如果被旋转,只有这种形式.问最小元素是?(假设没有重复元素) 思路:如果是序没乱,直接返回A[1],如果乱了,二分查找还是可以的,O(1)可能就不行了. 二分要点:mid有可能就是所要找的最小元素,所以不能轻易写出l=mid+1这样的语句,可能最小值就被忽略过了,因为我们无法直接判断A[mid]是否就是最小值.所以尽量应该是l=mid这样写,但是要防止死循环. 具体来说,可

18.07.20(lambda().sorted().filter().map().递归.二分查找)

1.lambda() 匿名函数 lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明一个函数 语法:函数名 = lambda 参数:返回值 注意: (1)参数可以有多个,多个参数用逗号隔开 (2)匿名函数不管多复杂.只写一行.且逻辑结束后直接返回数据 (3)返回值和正常函数一样1,可以是任意数据类型 我们通过__name__()查看函数名字 例: a = lambda x : x * xprint(a(5)) ==>25print(a.__name__) ==><lamb

递归二分查找

def find(list,num): length = int(len(list) / 2) #取列表长度中间值 if length > 0: list_left = list[:length] list_right = list[length:] if num > list_left[-1]: print('num肯定在右半边的列表里') list = list_right print(list) return find(list,num) elif num < list_right

二分查找算法(递归与非递归两种方式)

首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下所示. /* * 非递归二分查找算法 * 参数:整型数组,需要比较的数. */ public static int binarySearch(Integer[]srcArray,int des){ //第一个位置. int low=0; //最高位置.数组长度-1,因为下标是从0开始的. int h

递归和非递归的二分查找

思路很简单,代码注释已标注 #include <stdio.h> //递归二分查找 int binarySearch(int*start,int *end,intfindData){ if (start > end) {      // 递归边界条件 return -1; } int *mid = start + (end - start)/2;     //根据中间值不断二分缩小待查元素所在范围 if (findData == *mid) { return *mid; }else if