下面是一个简单的函数,它将字符串转换为整数。
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*
参数的情况下编写递归函数?
5条答案
按热度按时间bbmckpt71#
当然,这很容易,但你需要写两个函数,一个带有累加器,像这样:
s2j5cfk02#
好吧,你可以对使用该功能的人隐藏该功能。所以你将有一个名为
int str2int(char *str)
的函数,它将在此后调用int str2int(char *c, int *i)
。我以前就是这么做的。
1tuwyuhd3#
我想你可以使用horner scheme来避免任何'i'。
你必须反转字符串(是的,退出丑陋),然后你可以简单地用途:
ozxc1zmp4#
一种方法是将数字的长度作为参数传递,这样我们就可以有效地向后读取:
那就这样叫吧:
或者:
但是,为字符串的长度而烦恼并不总是最佳的。另外,如果一个字符串在一个数字后面有字符,我们就必须手动计算,因为这个函数不会为我们做这件事。我们不能(不应该)在函数中使用
strlen()
来避免传递参数,因为这会导致每次重新计算字符串长度的速度大大降低。肯定有办法从一开始就做到这一点,即使我们不得不拿出重炮:不,
(int)
转换不是可选的。基本上,所有的数学计算10的幂,我们需要乘以我们当前的数字,基于最后一次递归调用返回的数字。我知道这可能是一个学习练习,但递归并不是编程的全部。在某些语言中,对于某些任务,这是一些人,包括我自己,会称之为美丽的,但从它的外观来看,这不是其中之一。
qyzbxkaa5#
使用递归甚至处理输入零
public static int getString(String s){
if(s.length()==1){
}