2015-12-19 2 views
-7

Вот Binary Search код в Python:Рекурсивная функция: В чем разница между C++ и Python?

def binarySearch(arr,key,low,high): 
    if high < low: 
     return -1 
    mid = (low+high) >> 1 
    if arr[mid] < key: 
     binarySearch(arr,key,mid+1,high) 
    elif arr[mid] > key: 
     binarySearch(arr,key,low,mid-1) 
    else: 
     return mid 
arr = [1,2,3,4,5,6] 
length = len(arr) 
result = binarySearch(arr,6,0,length-1) 
print('result:',result) 

Выход:

result:None 

Но я ожидал:

result:5 

Затем я пишу подобный код в C++:

int binarySearch(int arr[],int key,int low,int high) 
{ 
    if(high < low) 
     return -1; 
    int mid = (low+high) >> 1; 
    if(arr[mid] < key) 
     binarySearch(arr,key,mid+1,high); 
    else if(arr[mid] > key) 
     binarySearch(arr,key,low,mid-1); 
    else 
     return mid; 
} 
int main() 
{ 
    int arr[] = {1,2,3,4,5,6}; 
    int len = sizeof(arr)/sizeof(arr[0]); 

    int result = binarySearch(arr,6,0,len-1); 
    cout<<"result:"<<result<<endl; 
    return 0; 
} 

Выход:

result:5 

Она работает идеально.
Может ли кто-нибудь объяснить причину этого странного поведения?
P.S. Я знаю, что я должен использовать

return binarySearch(...) 

в Python, но я хочу знать, почему код C++ может отлично работает.

+2

Речь идет не только о C++, но и об ошибке в вашем Python. Вы ничего не возвращаете в блок 'if' или' elif'. Только 'else' имеет оператор' return'. Попробуйте 'return binarySearch (...)' в ваших блоках 'if' и' elif' – Arc676

+3

Ваш код на C++ такой же багги, как ваш код на Python, кстати. – Mat

+1

@ Arc676 Но почему код C++ может работать идеально? – Ren

ответ

2

: C код ++ не работу отлично. Это неопределенное поведение и все может случиться. Это включает в себя работу, просто внезапно останавливая на работу завтра, или на Сочельник и удалить все файлы ...

C++ проект стандарта n4527 (6.6.3/2 [stmt.return]):

Выражение или рамно-Init-список оператор return называется его операндом. Оператор return без операнда должен использоваться только в функции, тип возврата которой является cv void, конструктором (12.1) или деструктором (12.4). Оператор return с операндом типа void должен использоваться только в функции, возвращаемый тип которой является vvoid. Оператор return с любым другим операндом должен использоваться только в функции, тип возврата которой не является vv void; оператор return инициализирует объект или ссылку, которая должна быть возвращена с помощью инициализации копирования (8.5) из операнда. [Примечание. Оператор возврата может включать в себя создание и копирование или перемещение временного объекта (12.2). Операция копирования или перемещения, связанная с оператором возврата, может быть исключена или рассматривается как rvalue с целью разрешения перегрузки при выборе конструктора (12.8). - конец примечание] [Пример:

std::pair<std::string,int> f(const char* p, int x) { 
    return {p,x}; 
} 

- конец пример] Измельчитель от конца функции эквивалентно возврату без значения; это приводит к неопределенному поведению в возвращающей значение функции.

Он четко определяет неопределенное поведение в конце.

Это, кажется, работает в вашем случае, это случайная авария, не рассчитывайте на нее. Такой код должен быть исправлен.

В конце концов, все это сводится к возврату python none, если вы явно не возвращаете что-то, а C++ дает неопределенное поведение, если вы сообщите ему, что хотите вернуть какой-то тип, но на самом деле этого не делаете.

+0

Хороший ответ, спасибо. – Ren

0

Вы должны добавить оператор возврата в seconf if и elifs. Этот код работает

def binarySearch(arr,key,low,high): 
    if high < low: 
     return -1 
    mid = (low+high) >> 1 
    if arr[mid] < key: 
     return binarySearch(arr,key,mid+1,high) 
    elif arr[mid] > key: 
     return binarySearch(arr,key,low,mid-1) 
    else: 
     return mid 
arr = [1,2,3,4,5,6] 
length = len(arr) 
result = binarySearch(arr,6,0,length-1) 
print result # 5 
+0

Почему код C++ может работать идеально? – Ren

Смежные вопросы