构造递归函数典例

原题如下:
我们要求找出具有下列性质数的个数(包含输入的自然数nnn):
先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止.

输入格式:

1个自然数n(n≤1000)
输出格式:

1个整数,表示具有该性质数的个数。

输入样例#1: 输出样例#1:
6 6

说明
满足条件的数为
6,16,26,126,36,136
下面是我的代码:

#include<stdio.h>
main()
{
 int func(int x);
 int n,y;
 scanf("%d",&n);
 y=func(n);
 printf("%d",y);
}
int func(int x)
{
 int cnt=1;
 for(int i=1;i<=x/2;i++)
 {
  cnt++;
  func(i);
 }
 return cnt;
 } 

问题说明:每一个数n可以在其左边与之组合的数(<=n/2)需要自身先与该数(n)组合,再将能与n/2组合的所有数与n组合。
所以很明显这是一个递归问题。
递归问题的关键是如何构造一个递归函数,下面是这道题的构造思路:
①n=1时,n/2=0,只有1自身,该函数应计算出1。
②n=2时,n/2=1,所以1及能与1组合的数首先都能单独与2组合,然后能与1组合的数与1形成的组合体本身也可与2组合。

(1)首先计入n自身
(2)所有能与n组合的数首先自身应满足<=n/2,所以可用for循环,使之出现由1~<=n/2的数;
(3) 在循环体中,首先应做的是对这些数进行统计,因为i满足<=n/2,i自身是可以直接与n组合的,即每个i与n形成的组合是需要计入的。
(4)每个i自身又是需要把i当做n再做相同的步骤。所以这里需要调用函数自身。
④在函数体内部调用函数本身时,可将函数理解为一个黑匣子,它的作用就是计算出复合条件的所有数的数目。
构造好函数,带入main函数直接使用即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值