शुभ दिन,अनंत recursion मेटा में पूर्णांक वर्ग मूल
मेरा एक दोस्त एक मेटा-समारोह में एक पूर्णांक वर्गमूल समारोह बदलने के बारे में पूछ रहा है। यहाँ मूल कार्य है:
unsigned isqrt(unsigned value)
{
unsigned sq = 1, dlt = 3;
while(sq<=value)
{
sq += dlt;
dlt += 2;
}
return (dlt>>1) - 1;
}
मैं constexpr
का उपयोग कर एक मेटा संस्करण लिखा था, लेकिन उन्होंने कहा कि वह किसी कारण से नई सुविधा का उपयोग नहीं कर सकते हैं:
constexpr std::size_t isqrt_impl
(std::size_t sq, std::size_t dlt, std::size_t value){
return sq <= value ?
isqrt_impl(sq+dlt, dlt+2, value) : (dlt >> 1) - 1;
}
constexpr std::size_t isqrt(std::size_t value){
return isqrt_impl(1, 3, value);
}
तो मैंने सोचा कि ऐसा नहीं होना चाहिए परिणत कि कड़ी करने के लिए टेम्पलेट struct है कि यह रिकर्सिवली स्वयं कहता है कि हो सकता है:
template <std::size_t value, std::size_t sq, std::size_t dlt>
struct isqrt_impl{
static const std::size_t square_root =
sq <= value ?
isqrt_impl<value, sq+dlt, dlt+2>::square_root :
(dlt >> 1) - 1;
};
template <std::size_t value>
struct isqrt{
static const std::size_t square_root =
isqrt_impl<value, 1, 3>::square_root;
};
दुर्भाग्य से, इस अनंत प्रत्यावर्तन (जीसीसी 4.6.1 पर) खड़ी कर रहा है और मैं यह पता लगाने की क्या गलत हो w है असमर्थ हूँ कोड के साथ। यहाँ त्रुटि है:
C:\test>g++ -Wall test.cpp
test.cpp:6:119: error: template instantiation depth exceeds maximum of 1024 (use
-ftemplate-depth= to increase the maximum) instantiating 'struct isqrt_impl<25u
, 1048576u, 2049u>'
test.cpp:6:119: recursively instantiated from 'const size_t isqrt_impl<25u, 4u
, 5u>::square_root'
test.cpp:6:119: instantiated from 'const size_t isqrt_impl<25u, 1u, 3u>::squar
e_root'
test.cpp:11:69: instantiated from 'const size_t isqrt<25u>::square_root'
test.cpp:15:29: instantiated from here
test.cpp:6:119: error: incomplete type 'isqrt_impl<25u, 1048576u, 2049u>' used i
n nested name specifier
धन्यवाद सब,
यदि आप रिकर्सिव फ़ंक्शन का उपयोग करते हैं तो वास्तविक रिकर्सन गहराई क्या होती है? – sharptooth
@ शार्पूटोथ यह किसी भी मूल्य के साथ होता है, ऐसा नहीं है कि उपयोग किया गया मान ओवरफ्लो का कारण बन रहा है। – AraK