程序填空题:递归函数的实现与调用
函数不能嵌套定义,但是可以嵌套调用。那函数可不可以调用自己呢?
我们先看求阶乘的函数。

在这里,我们使用了一个循环将1到n的数值依次相乘进行了计算,并将得到的乘积做为结果进行了返回。
你有没有发现,我们其实还可以换一个视角来思考这个问题,我们可以将n!看做n和(n-1)!的乘积,而(n-1)!又可以被看作n-1和(n-2)!的乘积……直到2!被看成2和1!的乘积,1!为1为止。

由这个思想所引导,老师实现了下面这个函数:

看起来是不是很简单?举个例子来看,如果我们传入给函数的n是5,我们将得到:

我们称这种在一个函数的定义中调用自身的情况为递归调用。老师设计的上面这个函数就是一个递归实现的计算阶乘的函数。
学习递归的函数调用更多是学习这种与数学归纳法有异曲同之妙的思想,在遇到问题时,很多情况下,我们可以把待解问题逐层归约为更简单的问题,直到这个问题变成一个显而易见的一般性问题。而这种思想表现在程序设计中,就是函数递归调用。
下面我们做一个简单的题目吧,对于给定的正整数N,求它的各位数字之和。
### 输入格式:
输入为一个不超过10^ 9的正整数。
### 输出格式:
输出各位数字之和。
### 输入样例:
1234
### 输出样例:
10
假设我们输入的正整数为1234,对这4位数字求和,可以看成最后一位的值4和123的位数和相加。123的位数之和,可以看成是3和12的位数和相加,……直到只有一位数。
c++
#include<stdio.h>
int sum(int n);
int main()
{
int m,s;
scanf("%d",&m);
s=@@[sum(m)](1);//调用求各位数字之和的函数
printf("%d",s);
return 0;
}
int sum(int n)
{
if(@@[n<10](2)) return n;//如果只有一位数,则位数和为自身
else
{
return @@[n%10+sum(n/10);](2)//n的各位数字之和为最后一位数字加上去掉最后一位的各位数字和
}
}
答案:
第1空:sum(m)
第2空:n<10
第3空:n%10+sum(n/10);
我们先看求阶乘的函数。

在这里,我们使用了一个循环将1到n的数值依次相乘进行了计算,并将得到的乘积做为结果进行了返回。
你有没有发现,我们其实还可以换一个视角来思考这个问题,我们可以将n!看做n和(n-1)!的乘积,而(n-1)!又可以被看作n-1和(n-2)!的乘积……直到2!被看成2和1!的乘积,1!为1为止。

由这个思想所引导,老师实现了下面这个函数:

看起来是不是很简单?举个例子来看,如果我们传入给函数的n是5,我们将得到:

我们称这种在一个函数的定义中调用自身的情况为递归调用。老师设计的上面这个函数就是一个递归实现的计算阶乘的函数。
学习递归的函数调用更多是学习这种与数学归纳法有异曲同之妙的思想,在遇到问题时,很多情况下,我们可以把待解问题逐层归约为更简单的问题,直到这个问题变成一个显而易见的一般性问题。而这种思想表现在程序设计中,就是函数递归调用。
下面我们做一个简单的题目吧,对于给定的正整数N,求它的各位数字之和。
### 输入格式:
输入为一个不超过10^ 9的正整数。
### 输出格式:
输出各位数字之和。
### 输入样例:
1234
### 输出样例:
10
假设我们输入的正整数为1234,对这4位数字求和,可以看成最后一位的值4和123的位数和相加。123的位数之和,可以看成是3和12的位数和相加,……直到只有一位数。
c++
#include<stdio.h>
int sum(int n);
int main()
{
int m,s;
scanf("%d",&m);
s=@@[sum(m)](1);//调用求各位数字之和的函数
printf("%d",s);
return 0;
}
int sum(int n)
{
if(@@[n<10](2)) return n;//如果只有一位数,则位数和为自身
else
{
return @@[n%10+sum(n/10);](2)//n的各位数字之和为最后一位数字加上去掉最后一位的各位数字和
}
}
答案:
第1空:sum(m)
第2空:n<10
第3空:n%10+sum(n/10);