C语言程序设计 递归应用举例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例 7-7Hale Waihona Puke Baidu计算两个整数的最大公约数。 程序设计思路:利用辗转相除法计算两个整数的最大公约数的算法如下: (1) 如果x除以y的余数为0,则y即为最大公约数,返回y值,算法结束。 (2) 如果x除以y的余数不为0,则用y和x%y做参数再重复求最大公约数。反复进行(1)、 (2)的操作。 例如x=341,y=132,341除以132,商是2,余数为77,因为余数≠0,所以置x=132,y=77, 依次类推,最后22除以11时,余数为0,算法终止,132和341的最大公因数是11。 参考程序如下:
}
(3)由于 fibonacci 数列增长很快,因此 fibonacci 函数返回值定义为 long。 参考程序如下:
/*程序名:7_6.c*/ /*功能:求 Fibonacci 数列第 n 项的值 */ #include <stdio.h> int fibonacci(int);
int main() {
return 0; }
int gcd(int x , int y) {
if( x % y = = 0) return y;
else
return gcd(y , x % y); }
程序运行结果:
请输入两个整数:341,132 341 , 132 的最大公约数是 11
【例 7-8】反向输出一个长整数 程序设计思路: (1) 如果要输出的数据只有一位,则“反向输出”问题可简化为输出一位整数。 (2) 如果要输出的数据超过一位,则可将该整数分为两部分:个位上的数字和个位以前 的数字。个位上的数字可以直接输出,而个位以前的数字又可以看成一个新的整数,重复执 行“反向输出”的操作。这时,反向输出在规模上缩小了一位,但求解的方法还是一致的。 (3) 用表达式 x % 10 可以分离出一个整数个位上的数字,用表达式 x / 10 可以表示出 个位以前的数。定义一个反向输出函数 invertLongInt,每次先用 x % 10 计算并输出个位 上的数,然后用 x / 10(即个位以前的数)做参数调用自己,不断进行下去,直到只剩一 位数字。 参考程序如下:
int n;
printf("请输入一个整数:"); scanf("%d", &n);
printf("Fibonacci ( %d ) = %ld", n, fibonacci (n) );
return 0; }
int fibonacci (int n) {
if (n = =0 || n = = 1)
7.3.3 递归应用举例
【例 7-6】求 Fibonacci 数列第 n 项的值。Fibonacci 数列以 1,1 开头,以后每一项都 是前两项之和。
1,1,2,3,5,8,13,21…… 程序设计思路: (1)求 Fibonacci 数列第 n 项的值可用递归形式定义为:
fibonacci (0) = 1 fibonacci (1) = 1 fibonacci (n) = fibonacci (n - 1) + fibonacci (n - 2)
printf(“逆向输出结果为:”) invertLongInt(iNumber);
return 0; }
void invertLongInt(long x) {
if(x >=0 && x <= 9) printf("%d\n" , x);
else { printf("%d" , x % 10);
invertLongInt(x / 10); } }
/*递归函数的定义*/
return 1; else
return fibonacci ( n - 1) + fibonacci ( n - 2); }
程序运行结果:(分别运行 4 次程序)
请输入一个整数:10 Fibonacc( 10 ) = 55 请输入一个整数:10 Fibonacc( 20 ) = 6765 请输入一个整数:20 Fibonacc( 25 ) = 75025 请输入一个整数:30 Fibonacc( 30 ) = 832040
上述定义将求解第 n 项化简为求解第 n-1 和 n-2 项,求解在规模上缩小了,但求解的 方法是一致的。
(2)定义 fibonacci 函数计算第 n 项的值 int fibonacci(int n)
{ if(n ==0 || n == 1) return 1; else return fibonacci( n – 1 ) + fibonacci( n – 2 );
程序运行结果:
请输入一个整数:123456 逆向输出结果为:654321
/*程序名:7_7.c*/ /*功能:求两个整数的最大公约数 */ #include <stdio.h> int gcd(int,int);
int main() {
int a , b;
printf("请输入两个整数:"); scanf("%d,%d", &a , &b);
printf("%d , %d 的最大公约数是 %d", a, b, gcd(a , b) );
/*程序名:7_8.c*/ /*功能:反向输出一个长整数 */ #include <stdio.h> void invertLongInt(long);
int main() {
unsigned long iNumber;
printf("请输入一个整数:"); scanf("%ld" , &iNumber);
}
(3)由于 fibonacci 数列增长很快,因此 fibonacci 函数返回值定义为 long。 参考程序如下:
/*程序名:7_6.c*/ /*功能:求 Fibonacci 数列第 n 项的值 */ #include <stdio.h> int fibonacci(int);
int main() {
return 0; }
int gcd(int x , int y) {
if( x % y = = 0) return y;
else
return gcd(y , x % y); }
程序运行结果:
请输入两个整数:341,132 341 , 132 的最大公约数是 11
【例 7-8】反向输出一个长整数 程序设计思路: (1) 如果要输出的数据只有一位,则“反向输出”问题可简化为输出一位整数。 (2) 如果要输出的数据超过一位,则可将该整数分为两部分:个位上的数字和个位以前 的数字。个位上的数字可以直接输出,而个位以前的数字又可以看成一个新的整数,重复执 行“反向输出”的操作。这时,反向输出在规模上缩小了一位,但求解的方法还是一致的。 (3) 用表达式 x % 10 可以分离出一个整数个位上的数字,用表达式 x / 10 可以表示出 个位以前的数。定义一个反向输出函数 invertLongInt,每次先用 x % 10 计算并输出个位 上的数,然后用 x / 10(即个位以前的数)做参数调用自己,不断进行下去,直到只剩一 位数字。 参考程序如下:
int n;
printf("请输入一个整数:"); scanf("%d", &n);
printf("Fibonacci ( %d ) = %ld", n, fibonacci (n) );
return 0; }
int fibonacci (int n) {
if (n = =0 || n = = 1)
7.3.3 递归应用举例
【例 7-6】求 Fibonacci 数列第 n 项的值。Fibonacci 数列以 1,1 开头,以后每一项都 是前两项之和。
1,1,2,3,5,8,13,21…… 程序设计思路: (1)求 Fibonacci 数列第 n 项的值可用递归形式定义为:
fibonacci (0) = 1 fibonacci (1) = 1 fibonacci (n) = fibonacci (n - 1) + fibonacci (n - 2)
printf(“逆向输出结果为:”) invertLongInt(iNumber);
return 0; }
void invertLongInt(long x) {
if(x >=0 && x <= 9) printf("%d\n" , x);
else { printf("%d" , x % 10);
invertLongInt(x / 10); } }
/*递归函数的定义*/
return 1; else
return fibonacci ( n - 1) + fibonacci ( n - 2); }
程序运行结果:(分别运行 4 次程序)
请输入一个整数:10 Fibonacc( 10 ) = 55 请输入一个整数:10 Fibonacc( 20 ) = 6765 请输入一个整数:20 Fibonacc( 25 ) = 75025 请输入一个整数:30 Fibonacc( 30 ) = 832040
上述定义将求解第 n 项化简为求解第 n-1 和 n-2 项,求解在规模上缩小了,但求解的 方法是一致的。
(2)定义 fibonacci 函数计算第 n 项的值 int fibonacci(int n)
{ if(n ==0 || n == 1) return 1; else return fibonacci( n – 1 ) + fibonacci( n – 2 );
程序运行结果:
请输入一个整数:123456 逆向输出结果为:654321
/*程序名:7_7.c*/ /*功能:求两个整数的最大公约数 */ #include <stdio.h> int gcd(int,int);
int main() {
int a , b;
printf("请输入两个整数:"); scanf("%d,%d", &a , &b);
printf("%d , %d 的最大公约数是 %d", a, b, gcd(a , b) );
/*程序名:7_8.c*/ /*功能:反向输出一个长整数 */ #include <stdio.h> void invertLongInt(long);
int main() {
unsigned long iNumber;
printf("请输入一个整数:"); scanf("%ld" , &iNumber);