【发布时间】:2016-03-01 16:39:55
【问题描述】:
我正在为 C 语言考试而学习,今天我很难实现我被告知的递归,但我确实使用迭代函数实现了它,然后我不知何故发现我可以轻松地使其递归。例如:(该函数的目的是从右到左查找0-9之间的字符,将它们从char转换为int并按顺序打印)
示例:
char chArray[] = { '2','4','e','b','c','@','0' };
printf("%d", buildNumber_rec(chArray, 7));
迭代:
int buildNumber(char chArray[], int n){
int i,num=0;
for(i=0;i<n;i++)
if(chArray[i]>='0' && chArray[i]<='9')
num=10*num + (chArray[i]-'0');
return num;
}
递归:
int buildNumber_rec (char chArray[], int n){
char last=chArray[n-1];
if(!n) return 0;
if(last>='0' && last<='9')
return (last-'0')+10*buildNumber_rec(chArray,n-1);
return buildNumber_rec(chArray,n-1);
}
输出:
240
我知道这听起来太笼统了,但是是否可以通过首先用迭代函数实现递归练习来了解如何解决递归练习?换句话说,通过首先进行迭代来发现如何递归求解的模式(如果,诅咒,这是我唯一的选择 - 意思是,我不知道如何递归求解)。
【问题讨论】:
-
把递归想象成迭代操作堆栈数据结构。
-
“如何通过首先使用迭代函数实现递归练习来解决递归练习” - 不太清楚这是什么意思,介意详细说明吗?
-
请注意,如果
n为 0,则charArray[n-1]未定义。先做测试。 -
通常会尝试避免递归并以相反的方式进行:使用迭代重新实现递归算法。原因是摆脱堆栈。现代编译器通常会自动将尾递归转换为迭代循环。
-
@IlanAizelmanWS 好的,给出你的例子和我自己的经验。简短的回答是:我认为这是可能,但我不确定它是否总是可能