您的位置:程序门 -> c/c++ ->



递归函数问题百思不得其解,请大家指点!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


递归函数问题百思不得其解,请大家指点![已结贴,结贴人:matwav12]
发表于:2007-11-24 16:33:37 楼主
    最近遇到一个小小的难题:“用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定。”

该问题的主要难点就是:“递归法”,小弟一直为想出解决办法,望高手指点,谢谢!!
发表于:2007-11-24 16:41:081楼 得分:0
把对每个数字字符的处理放在函数里,最后在调用自己,把下一个字符传入函数。

另外,每次把对传入的字符进行判断,如果不合法的话就return,以此作为递归的

结束条件。
发表于:2007-11-24 16:48:242楼 得分:0
"把对每个数字字符的处理放在函数里,最后在调用自己,把下一个字符传入函数   "???是什么意思啊?2楼可否明示?
发表于:2007-11-24 17:03:553楼 得分:5
void   convert(const   int&   a,cstring&   str)
{
if(a==0)
{
return;
}

cstring   temp;

temp.format("%d",a%10);
str   =   temp   +   str;

convert(a/10,str);  
}


其实用一个循环就可以完成
发表于:2007-11-24 17:09:124楼 得分:0
#include"stdio.h"
#include"conio.h"

char   fun(char*);
int   main()
{
        char   string[]   =   "147258";
        fun(string);
        getch();
        return   0;
}

char   fun(char*   s)
{
        printf("%c",*s);
        if('\0'   ==   *(s+1))
        {
                return   *s;
        }
        else
        {
                fun(++s);
        }
}
发表于:2007-11-24 17:12:095楼 得分:5
递归函数这样写好看一些:
char   fun(char*   s)
{

        if('\0'   ==   *s)
        {
                return   *s;
        }
        else
        {
                printf("%c",*s);
                fun(++s);
        }
}
发表于:2007-11-24 17:21:126楼 得分:5
试着写了一个,vc编译了一下,应该可以满足楼住的要求!
c/c++ code
#include <stdio.h> #include <windows.h> #define int_len 10 /*32位int的10进制位数+1*/ void decompose(unsigned int n, char *str) { int temp=0; if(n>=10) { temp=n%10; *str++=temp+'0'; n=(n-temp)/10; decompose(n, str); } else { *str=n+'0'; return ; } } int main() { unsigned int n=483; /*可以任意输入整数*/ char *p=char *)malloc(int_len+1); memset(p,0,20); decompose(n, p); strrev(p); /*字符串反序*/ printf("%s\n",p); return 0; }
发表于:2007-11-24 17:58:127楼 得分:0
问题已解决,谢谢大家热心帮助!!
发表于:2007-11-24 18:56:158楼 得分:0
/*   俺的最终答案如下,供大家参考交流   */

#include   <stdio.h>
#include   <windows.h>

//函数名:makechar
//功能:将正整数转化成字符串

void   makechar(int   n,char   *b)  
{char   a;
  int   tempt;
  if(n==0)  
{*b='\0';
return;  
}  
  tempt=n%10;
  a=(char)tempt+48;
  *b++=a;
  makechar(n/10,b);
}

//********主函数******************//
void   main()
{int   n;
  char   b[]="",*p;
    printf("请输入任意正整数:\n");
    scanf("%d",&n);
    makechar(n,b);
    p=strrev(b);         //字符串反转函数:strrev()返回的是char*   的量                      
    printf("%s\n",b);

}
发表于:2007-11-24 19:14:349楼 得分:5
有2点要提醒楼主:
1、你的功能要求是“将正整数转化成字符串”,参数也定义为了int型,那么函数类就应该对参数的正确性进行判断,即参数必须为非负数,否则应该调用出错处理,如提示输入错误!
2、主函数中的char   b[]=""   仅仅只申请了1个char   空间,递归函数中所写入的数据都是越界写入的----严重时会导致程序崩溃!
c/c++ code
#include <stdio.h> #include <windows.h> //函数名:makechar //功能:将正整数转化成字符串 void makechar(int n,char *b) { char a; //加入对n的范围判断的代码,避免负数输入导致最终的错误结果 int tempt; if(n==0) { *b='\0'; return; } tempt=n%10; a=char)tempt+48; *b++=a; makechar(n/10,b); } //********主函数******************// void main() { int n; char b[]="",*p; //可以用sizeof(b)测量一下b的宽度!-----后面写入的内容都越界了! printf("请输入任意正整数:\n"); scanf("%d",&n); makechar(n,b); p=strrev(b); //字符串反转函数:strrev()返回的是char* 的量 printf("%s\n",b); }
发表于:2007-11-24 19:35:0810楼 得分:0
楼主,咱们做个试验,在你的主函数里面增加两条用于测试的码,你然后输入一个长一点的数字,如:1234567890(或者输入32位正整数的最大值2147483647),看看是什么结果。
c/c++ code
//********主函数******************// void main() { char a[]="hellow matwav12"; //用于测试 int n; char b[]="",*p; printf("请输入任意正整数:\n"); scanf("%d",&n); makechar(n,b); p=strrev(b); printf("%s\n",b); printf("%s\n",a); //看看字符串a怎么样呢? printf("%d\n",n); //看看开始输入的数据还在不在? } ////////////同样的代码,稍作修整再试验一下///////////////////////////////////////// void main() { char a[]="hellow matwav12"; //用于测试 int n; char b[11],*p; //可以用sizeof(b)测量一下b的宽度,给b足够的空间 printf("请输入任意正整数:\n"); scanf("%d",&n); makechar(n,b); p=strrev(b); printf("%s\n",b); printf("%s\n",a); //看看字符串a怎么样呢? printf("%d\n",n); //看看开始输入的数据还在不在? }
发表于:2007-11-24 22:06:3911楼 得分:0
哈哈,果然是高手如林啊!!谢谢10楼的提示!!
发表于:2007-11-24 22:19:1212楼 得分:0
异常处理的代码肯定是要加的!

且程序的很大一部分代码都是用来处理异常情况的!


快速检索

最新资讯
热门点击