मुझे कोड का एक टुकड़ा लिखना है जिसका उत्तरदायित्व किसी दिए गए नंबर में अंतिम बिट सेट की स्थिति की गणना करना है।

यहाँ मेरे प्रयासों में से एक है:

find_last_bit_set(Value, Result) :-
    do_find_last_bit_set(Value, -1, Result).
do_find_last_bit_set(0, R, R).
do_find_last_bit_set(Value, Result, R) :-
    Y #= Value // 2,
    Result1 is Result + 1,
    do_find_last_bit_set(Y, Result1, R).

हालाँकि समस्या यह है कि उपरोक्त कोड कभी नहीं रुकता है। क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूँ?

1
krzysiekb 2 सितंबर 2019, 18:52

1 उत्तर

सबसे बढ़िया उत्तर

do_find_last_bit_set/3 के फिस्ट क्लॉज के बाद, दूसरा क्लॉज जो Value के 0 होने से सुरक्षित नहीं है, की खोज करके आगे के समाधान का प्रयास करने के लिए इंजन को कुछ भी नहीं रोक रहा है।

आप do_find_last_bit_set/3 के दूसरे खंड के पहले लक्ष्य के रूप में एक गार्ड Value #\= 0 जोड़ना चाह सकते हैं:

do_find_last_bit_set(0, R, R).
do_find_last_bit_set(Value, Result, R) :-
    Value #\= 0,
    Y #= Value // 2,
    Result1 is Result + 1,
    do_find_last_bit_set(Y, Result1, R).
1
gusbro 2 सितंबर 2019, 18:59