[英]Convert string to integer recursively?
這是一個將字符串轉換為整數的簡單函數。
int str2int(char *str)
{
int ret = 0;
char *c;
for (c = str; (*c != '\0') && isdigit(*c); ++c)
ret = ret*10 + *c - '0';
return ret;
}
作為練習,我想編寫一個執行相同功能的遞歸函數。 這就是我想出的。
int str2int2(char *c, int *i)
{
if (*c == '\0' || !isdigit(*c))
return *i;
*i = *i * 10 + *c - '0';
return str2int2(c + 1, i);
}
.
.
int i = 0;
.
... str2int2(str, &i);
有沒有一種方法可以在不使用額外的int*
參數的情況下編寫遞歸函數?
當然,這很容易,但是您需要編寫兩個函數,其中一個帶有累加器,如下所示:
int str2int_rec(char *c, int accum)
{
if (!c || !*c || !isdigit(*c))
return accum;
return str2int_rec(c + 1, accum * 10 + (*c - '0'));
}
int str2int(char *c)
{
return str2int_rec(c, 0);
}
好吧,您可以向使用該功能的人員隱藏該功能。 因此,您將擁有一個名為int str2int(char *str)
的函數,此函數int str2int(char *str)
將調用int str2int(char *c, int *i)
。
這就是我過去的做法。
我認為您可以使用horner方案 ,以便不保留任何“ i”。
您必須反轉字符串(是的,很難退出),然后可以簡單地使用:
int str2int (char* str)
{
if (*str+1)
{
return 10*str2int(str+1)+(*str-'0');
}
return 0;
}
一種方法可能涉及將數字的長度作為參數傳遞,以便我們可以有效地向后閱讀:
int strtoi(char *c, size_t l)
{
return l ? c[l-1] - '0' + 10 * strtoi(c, l - 1) : 0;
}
然后這樣稱呼它:
int i = strtoi("432", 3);
要么:
char *c = "432";
int i = strtoi(c, strlen(c));
但是,打擾字符串的長度並不總是最佳的。 另外,如果字符串在數字后包含字符,則必須手動將其考慮在內,因為此函數不會為我們完成此操作。 我們不能(不應該strlen()
在函數中使用strlen()
以避免傳遞參數,因為這可能會導致每次重新計算字符串長度的速度大大降低。 即使我們必須帶出重型火炮,肯定也必須有一種從一開始就可以做到的方法:
int strtoi(char *c)
{
if(!isdigit(*c)) return 0;
int i = strtoi(c + 1);
return i + pow(10, (int)(log(i + 1)/log(10)) + (i != 0)) * (*c - '0');
}
不, (int)
強制轉換不是可選的。 基本上,所有這些數學運算都會根據上一個遞歸調用返回的數字計算出我們需要乘以當前數字的10的冪。
我知道這可能是學習活動,但是遞歸並不是編程的全部內容。 在某些語言中,對於某些任務,這就是我個人所稱的“美麗”,但是從外觀上看,這不是其中一種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.