【问题标题】:Why does my compiler go in an infinite loop with c++(binary search)?为什么我的编译器使用 c++(二进制搜索)进入无限循环?
【发布时间】:2021-06-10 06:06:02
【问题描述】:

当我尝试运行我的代码时,终端输出一个编译器行,然后变为空白。为什么我的终端会出现空白?又为什么会死循环?

代码如下:

#include <iostream>

using namespace std;

int biSearch(int list[] ,int lenght,int t);

int main() 
{

    int nums[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    int func_return = biSearch(nums,10,7);
    cout << func_return << endl;

    if(func_return != -1)
    {
        cout << "index: " << func_return << endl;
    }

    else
    {
        cout << "not found" << endl;
    }

}

int biSearch(int list[],int lenght,int t) 
{
    int f = 0;
    int l = lenght - 1;
    int m = (l - f) / 2;


    while(f<=l)
    {
        if (list[m] == t)
        {
            return m;
        }

        else
        {
            if (t < list[m])
            {
                l = m - 1;
                m = (l - f) / 2;
            }

            else
            {
                f = m + 1;
                m = (l - f) / 2;
            }
        }
    }

    
    return -1;
}

终端中断前的输出:

Copyright (C) Microsoft Corporation. Todos os direitos reservados.

Experimente a nova plataforma cruzada PowerShell https://aka.ms/pscore6

PS D:\Docs\CodeProjects\Nova pasta> cd "d:\Docs\CodeProjects\Nova pasta\" ; if ($?) { g++ hw.cpp -o hw } ; if ($?) { .\hw }

在这个输出之后,终端只打印一个单一的空白行。为什么我的编译器会进入一个无限循环?

【问题讨论】:

  • 在您的工具附带的任何调试器中运行程序(如果您没有调试器,请使用不同的工具进行调试)。当程序看起来卡在循环中时,暂停程序并“单步执行”代码,直到您循环几次或查看程序卡在循环中的原因。使用您所学的知识进行反向工作,以了解程序是如何陷入这种不需要的状态的。放弃一些可以放置“断点”的小测试,以帮助您快速跳转到您想要仔细查看的兴趣点..
  • 虽然我相信你相信你的背景故事很有吸引力,但如果它省略了你的历史(或者至少将它移到问题的末尾),你的问题将会得到改善。请参阅How to Ask,尤其是那些谈论直截了当的部分,就好像您正在为忙碌的人写作,他们可能只需要几秒钟就可以确定这个问题是否属于他们的专业领域。 (在这种情况下,他们可能会读到“我正在研究python”——这如何帮助某人确定这个问题需要什么专业知识?)
  • 不是你的编译器而是命令.\hw不会终止。尝试将 g++ hw.cpp -o hw 作为单个命令

标签: c++ iteration binary-search


【解决方案1】:

这是你真正的错误:

int m = (l - f) / 2;

问问自己这个。 (l-f)/2 是否准确计算 lf 之间的中点索引?如果你不明白,请告诉我,我会给出另一个提示。

【讨论】:

  • 哦,谢谢你帮我注意到它,公式是 m = (f + l) / 2;正确的?回答问题的方式非常好和有创意:)
  • 如果长度 == 1,我也可以通过简单地返回 list[0] 来解决另一个错误吗?
  • Nvr mind 尝试了一个长度为 1 的列表,但错误没有发生
  • @cachaçeirosdohawaii - 哦,没关系,我没有看到 (f &lt;= l) 的比较,我认为可能是 (f &lt; l)
  • 是的,(f+l)/2 是获得中点的更好等式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 2016-02-15
相关资源
最近更新 更多