Özyinelemeli Fonksiyon uygulaması

Yaklaşan bir sınav için çalışıyorum ve çalışma kılavuzundaki sorulardan biri:

Bir rakam hanesini temsil ettiği tamsayıya dönüştürmek için özyinelemeli bir C ++ işlevi yazın. İçin örneğin, “13531”, 13531 tamsayısını temsil eder. İşleviniz, tamsayı değerini döndürmelidir.

Dizgiyi bir tamsayıya dönüştürebiliyorum, ancak fonksiyonun özyinelemeli olması için temel durumun ne olması gerektiği konusunda sorun yaşıyorum. Herhangi bir öneri veya yardım çok takdir edilecektir.

1
Cevap göndermek ister misiniz?
katma yazar Yazan W Yusuf, kaynak
Özyinelemeli davanızın neye benzediğini bize gösterirseniz, temel durumun neye benzediğini size gösterebiliriz.
katma yazar MikeMB, kaynak

7 cevap

Temel durum boş bir dizedir.

Özyinelemenizin her adımı dizedeki bir karakteri tam sayıya dönüştürür. Ve özyinelemeli adım ipin geri kalanından geçer.

2
katma
Ödev sorularıyla başa çıkmanın en iyi yolu. Kod değil fikir verin. :-)
katma yazar pyon, kaynak
#include
#include
#include
using namespace std;
int convert(string x)
{
int c=x[0]-'0';//to get the numeric value of the first char in string
if(x.size()==1)//base case
    return c;
//in each time return the char with "x.size()-1" digits of zero and the first digit is for the number
return c*pow(10,x.size()-1)+convert(x.substr(1));
}
int main(){
string x;
getline(cin,x);
cout<

"12345", = 10000 + 2000 + 300 + 40 + 5 olarak döndürülecek

0
katma

pow 'ı kullanmadan ne yapabilirsin, şöyle:

#include 
#include 

int str_to_int(const std::string& str)
{
    if (str.size() == 0)
        return 0;//base case, end recursion
    else
        return (str[str.size() - 1] - '0') +
               10 * str_to_int(str.substr(0, str.size() - 1));
}

int main()
{
    std::cout << str_to_int("1234");
}
0
katma
Bu, özyinelemede çok sayıda dize nesnesi yarattığı için korkunç derecede verimsiz. Tamam, kimse verimlilikten bahsetmedi :-)
katma yazar Meixner, kaynak

Yineleyicileri kullanmak daha zarif görünüyor ve dönüşüm işlevinin alt dizelere uygulanabilmesi avantajına sahip.

#include 
#include 

using namespace std;

int str2int(string::const_iterator s, string::const_iterator e)
{
   if(s==e) return 0;
   --e;
   return str2int(s,e)*10+*e-'0'; 
}

int main()
{
   string s="12345";
   printf("%d\n",str2int(s.begin(),s.end()));
}
0
katma

kuyruklu özyineleme baskısı

#include
#include
void str2int(const std::string& s, int &result, int n = 0)
{
    if (n == s.size())
    {
        return;
    }

    result *= 10;
    result += s[n] - '0';
    return str2int(s, result, n + 1);
}

int main()
{
    int n = 0;

    str2int("1234", n);

    std::cout << n;
}
0
katma

Kendin olarak başlangıç ​​dizgisinde nasıl "yol gösterebilirsin"?

Bağırsaklığım bana "1357" den başlayacağımı "7" ile başlayacağımı, "135" 'i, sonra "5"' i, "13" 'ü, vb. Ve sonunda neyle kalacaksın? Boş bir dize!

0
katma

'Temel durum' ile 'temel durum' anlamına geldiğinden emin değilsiniz.

Kenar kasa, artık herhangi bir özyinelemeye ihtiyaç duymayan ve bu nedenle doğrudan işlenebilecek bir durumda olmalıdır. Bu nedenle, 'string' sadece bir rakam ( return str [0] - '0'; ) veya sıfır rakamlı ( return 0; ) olduğunda olabilir. . Sıfır rakamlı durum biraz daha genel olabilir.

Baz-10 sayısından başka bir rakam olabilirse, sayının 'tabanı' hakkında biraz daha fazla bilgi.

İlk önce sayının tabanını test etmeniz gerekebilir. C ++ 11 için   ondalık-değişmez (temel 10), sekizlik değişmez (temel 8) ve altıgen değişmez   (baz 16), ör. -0x123, -0123, -123. Yapabilirsin    cpp_integer_literal 'e göre test.

0
katma
Maalesef base 'nin ne anlama geldiğini yanlış anlayın.
katma yazar zhangwt, kaynak