c - 在c中打印倒计时数字的递归函数
问题描述
我很想编写一个程序,从键盘读取整数 n,并使用递归函数打印 n,n-1,... n。下面的代码有效,但我不完全理解为什么或涉及递归函数的步骤。有人可以解释一下吗?
void countingdown(int n){
if (n == 1){
printf("%d\n", n);
return;
}
else {
printf("%d\n", n);
countingdown(n - 1);
return;
}
}
int main(){
int n;
printf("Enter an integer: ");
scanf("%d", &n);
countingdown(n);
printf("\n");
return 0;
}
解决方案
例如,如果用户输入值 3,则会发生以下情况:
- 该函数
main
将countingdown
使用参数调用3
。 - 然后该函数
countingdown
将此参数3
与 value进行比较1
,并且由于该比较的计算结果为false,因此它将打印该数字3
,然后countingdown
使用 parameter 调用(即该函数将调用自己)2
。 - 的第二个实例
countingdown
现在将此参数2
与值1
进行比较,并且由于该比较的计算结果为假,它将打印数字2
并countingdown
使用参数调用1
。 - 这第三个实例
countingdown
现在将参数1
与 value1
进行比较,并且由于该比较现在评估为true,它将打印数字1
并且不会再次调用自己。
递归函数将参数1
视为特殊参数,因为这是它应该中止的值。当它遇到这个值时,它将停止递归调用自己。如果函数没有检查这个特殊值,它将永远继续倒计时,并且还会打印0
、-1
、-2
等。
推荐阅读
- python - 使用 SciKit Learn 进行机器学习的信心得分?
- xamarin - xamarin iOS 中的 MakeTextWritingDirectionRightToLeft(null)
- python - 使用 2 `requirements.txt` 时如何防止 conda 更新包
- javascript - 从这个 Array 检查中获得体面结果的最佳方法是什么?
- matlab - 如何创建结构?
- reactjs - create-react-app 启动错误 - 错误:没有为 '\node_modules\colorette' 找到有效的导出主程序
- rest - 字符串类型不是索引 int 类型的子类型。我正在尝试将 Json 字符串数组解析为对象列表。怎么了?
- sorting - 谷歌表格:为什么迭代计算会创建重复项,使公式变得奇怪?
- amazon-web-services - 从警报到 Lambda 的自定义输入或从警报到 SNS 的自定义输入
- html - 将内部元素放在“最大宽度”容器之外