1前言
我们知道,函数的递归是一种极其巧妙的编程技巧,用对函数的递归,可以极大程度上提高代码的精简度。
该文章所指向的是水仙花数,水仙花数(Narcissistic number)是指一个n位数 (n≥3),它的每个位上的数字的n次幂之和等于它本身。例如153就是一个水仙花数,因为153=1^3+5^3+3^3。水仙花数是自恋数(Self number)的一种,是数字计算中的一种有趣现象
而在该文章中,我们抛开常见的用循环迭代的方式来找水仙花数,而运用了函数递归思想进行编程找出水仙花数。
2代码的实现
函数部分的设计
用递归算法可以实现求更大范围内的水仙花数。
我们分别向函数传了三个参数
i为数字本体,*p算的是该数字的位数,而*q指的是各位上的数字(此处为变量在函数递归中的含义)
那么水仙花数的计算就可以把各个位上的*q和*p放入pow函数里进行计算然后求和得出。注意,虽然该函数类型和数据类型是整型int,但是我们仅仅是求各个位上的数字,所以不需要考虑因类型导致的数据丢失的问题。最后我们用递归将各位的幂的和加起来。
主函数部分的设计
在for循环生成的数字中寻找匹配的项,如果是水仙花数就打印。
用count变量记录水仙花数的个数。
代码运行结果
这样我们的水仙花数就求好啦!
3备注
1.该函数使用到的变量都进行了传址调用,这是因为如果我们变量是传值调用的话,在出函数范围的的时候,该变量就会销毁,就不能达到改变对应变量值的目的,从而也就不能实现函数递归。而传址调用恰好解决了这一问题。让递归算法中的函数可以调用后一次函数中的变量。
2.求次幂我们运用到了pow函数,要包含对应的头文件<math.h>。
3.该函数可以通过改for循环的范围实现对更大范围的水仙花数的展示。
下面是完整代码的呈现:
#include <stdio.h> #include <math.h> int narcissistic_number(int i, int* p, int* q) { if (i > 9) { (*p)++; *q = narcissistic_number(i / 10, p, q); } return *q + pow((i % 10), *p); } int main() { int i = 0; int j = 0; int count = 0; printf("该范围内的水仙花数有:"); for (i = 0; i <= 100000; i++) { int j= 0; int* q = &j; int c = 1; int* p = &c; int b = narcissistic_number(i, p, q); if (b == i) { printf("%d ", i); count++; } } printf("共有%d个\n", count); return 0; }
以上便是本文章的全部内容,如果该文章有什么问题或疏漏,欢迎各位大佬进行交流指正。