我想编写一个计算Succ(‘2468’) = '2469'
的递归函数。 ‘2468’
是一个数字字符串。
该练习给了我一些预定义的函数,例如last(ch)
,该函数返回字符串的最后一个字符start(ch)
,返回ch
,而没有最后一个字符addEnd(ch, c)
,在c
的末尾添加ch
并要求我返回一个字符串作为最终结果(即suc("123")="124"
)
我尝试了此代码,但它仅适用于2个字符的字符串。如果我的字符串长度> 2,则不起作用:
int successor (char*ch)
{
if (strlen (ch)==1)
return (int(*ch))+1);
else
return ((int(*ch))*10+successor(ch+1));}
答案 0 :(得分:2)
一个关键问题是这种逻辑:
(int(*ch))*10+successor(ch+1)
乘以10对于大数是不够的。我们需要乘以10的乘方,我们已经计算出了该乘方,但并没有挂在它上面:
strlen (ch)
或更具体地说:
strlen(ch) - 1
完整的解决方案:
#include <math.h>
#include <stdio.h>
#include <string.h>
#define digit(c) (c - '0')
int successor(char *string)
{
size_t power = strlen(string) - 1;
if (power == 0)
{
return digit(*string) + 1;
}
return digit(*string) * pow(10, power) + successor(string + 1);
}
int main() {
printf("%d\n", successor("2999"));
return 0;
}
输出
> ./a.out
3000
>
待办事项
如果successor()
传递了一个空字符串会发生什么:
printf("%d\n", successor(""));
如何修改代码以解决此问题?首先确定在这种情况下函数应该返回什么。如果向successor()
传递了一个字符串,该字符串表示一个太大而不能包含在int
中的数字,那么会发生什么:
printf("%d\n", successor("8589934592"));
如何修改代码以解决此问题?再次,首先确定函数 在这种情况下应该返回什么。
答案 1 :(得分:2)
似乎没有必要相乘或使用幂。考虑到您提供了额外的预定义功能,我想这里的目的是一种递归方式来表示长时间加进位。我不了解C,但这是JavaScript中的一个语法非常接近的插图。我希望这会有所帮助。
function successor(s){
if (s.length == 1){
if (s == '9'){
return '10';
} else {
// Return the successor character,
// not sure how this looks in C.
return String.fromCharCode(
s.charCodeAt(0) + 1);
}
}
let rightmost = successor(last(s));
// No carry so just return
// the string with the last
// character incremented
if (rightmost != '10'){
return addEnd(start(s), rightmost);
// We have a carry so
// continue the recursion
} else {
return addEnd(successor(start(s)), '0');
}
}
function last(s){
return s.substr(-1);
}
function start(s){
return s.substr(0, s.length - 1);
}
function addEnd(s, c){
return s + c;
}
console.log(successor('2999'));