递归的以疑问

ustbleetom 2009-06-14 02:09:00
递归老师也没讲,看了课本上那点不是很明白~
这个是写的输出 输入的数字的倒数第k个数 还是有点不明白~~
#include "stdio.h"
main()
{ int digit (int n,int k);
int n ,k; int j=0;
scanf("%d,%d",&n,&k);
printf ("原来是:%d\n",j);
j=digit(n,k);
printf("the number is :%d\n",j);

}
int digit(int n,int k)
{ int f=0,d=0;
if(k<=0) {f=-1;d=1;}
else if(k==1) {d=1;f=n%10; }
else {n=n/10;printf ("执行几次?");return(digit(n,--k));printf("这个不执行?");}//这个return是返回到哪?
printf("最后是%d\t",f);
if (d==1)
{printf("返回的%d\t",f);return (2*f);}
}

运行结果:
12365,4[enter]
原来是:0
执行几次?执行几次?执行几次?最后是2 返回的2 the number is :4


最好能把递归的过程说一下~~再给几个递归的例子和讲解就更好了~~谢了~~


...全文
15 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
2974786048 2009-06-14
  • 打赏
  • 举报
回复

/*-----------------------------------------
题目:输入的数字的倒数第k个数

时间:2009.06.14
-----------------------------------------*/

#include "stdio.h"

int main(void)
{
int digit (int n,int k); //形参n为输入的数字,k为返回的倒数第k位
int n ,k;
int j=0;

printf("\n请输入数字n和k!\n");
printf("n=");
scanf("%d",&n);
printf("k=");
scanf("%d",&k);
fflush(stdin);

printf ("\n您输入的数字是:%d\n",n); //你用的是j,当然会是0喽^*^,改为n

j=digit(n,k);

// printf("the number is :%d\n",j); //你这里要输出谁啊?

return 0;
}

int digit(int n,int k)
{
int f=0,d=0; //通过f返回倒数第k位的数字,d为判断所有数字是否都处理完,d=1,处理完

if(k<=0)
{
f=-1;
d=1;
}
else if(k==1)
{
d=1;
f=n%10;
}
else
{
n=n/10;
return(digit(n,--k));
}



if (d==1)
{
printf("返回的%d\n\n",f);
// return (2*f); //为什么要这条语句?
}

}



首先,printf ("原来是:%d\n",j);这里你用了变量j,而j初始化为0,所以输出当然为0,你本想输出的是变量n吧?这种错误尽量少犯,高手们很看不起这种低级错误,也不爱回答这种问题,我们相互帮助吧。。。

其次,程序最好给一些输入提示,要不然我面对着黑屏,还真不知道在键盘上按些什么。。。

递归其实就是同一个函数调用自身。。。

用这道题举例,比如你输入n=12345,k=3

程序先对你输入的k进行判断,1)k为负数或0,返回-1 2)k=1,通过对n进行取余来取得最后一位数字 3)k>0,把n除以10来截断最后一位,使k减1,这样,原来的倒数第k位,就变成了现在的第k-1位。。

n=12345,k=3

第一次调用:digit(12345,3) 调用结束后 n= 12345/10 =1234 k=2;
第二次调用: digit(1234,2) 调用结束后 n= 1234/10 =123 k=1;
第三次调用:digit(123,1) 调用结束后 d=1 f= 123%10 = 3 找到了倒数第3位,为数字3


看到这里你应该明白了。。自己动手向我这样写一下,你一定会明白的。。。

相互学习吧。。。




ustbleetom 2009-06-14
  • 打赏
  • 举报
回复
谢谢两位~~
有很多看着没用很乱的语句,是我为了看看递归过程加的~~
superbtl 2009-06-14
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090613/23/e13b885d-f232-4068-a67f-fd3ab41d99be.html
也是递归的 我也回答了问题 可以看下 也许会有帮助
superbtl 2009-06-14
  • 打赏
  • 举报
回复
#include "stdio.h"
int digit (int n,int k);
main()
{
int n ,k; int j=0;
scanf("%d,%d",&n,&k);
printf ("原来是:%d\n",j);
j=digit(n,k);
printf("the number is :%d\n",j);

}
int digit(int n,int k)
{ int f=0,d=0;
if(k<=0)
{
f=-1;
d=1;
}
else if(k==1)
{
d=1;
f=n%10; //当k==1,把d=1就是准备退出循环了,f赋值
}
else
{
n=n/10;
printf ("执行几次?");
return(digit(n,--k));
printf("这个不执行?");
}//这个return是返回到哪?
printf("最后是%d\t",f);
if (d==1)
{
printf("返回的%d\t",f);
return (2*f);
}
}

//这个是用k来控制递归次数,digit(n,--k)每次调用k就减一,知道减到k==1为止,并且每次都n/10;
//当k==1终止赋值顺便把f赋值用来返回
如果输入10000,4的话
k=4 n=10000
k=3 n=1000
k=2 n=100
k=1 n=10
这时候递归结束
f=n%10; f=0;返回2*f也是0


这个是最简单的递归了

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧