c primer 中 关于递归那一快看的不是太明白麻烦大家给指导下

时间:2021-07-08 15:43:53
c primer 中 关于递归那一快看的不是太明白麻烦大家给指导下
下面是 程序
#include "stdafx.h"
void to_binary (unsigned long n);

int _tmain(int argc, _TCHAR* argv[])
{
unsigned long number;
printf("enter an integer (q to quit): \n");
while (scanf("%ul", &number) == 1)
{

printf("binary an integer (q to quit): \n");
to_binary (number);
putchar('\n');
printf("enter an integer (q to quit): \n");
}
printf("done. \n");
getchar();
getchar();
getchar();
return 0;
}

void to_binary (unsigned long n)
{

int r;
r = n % 2;
if (n >= 2)
to_binary (n / 2);
putchar ('0' + r);
}

红色部分的函数不是太明白 麻烦大家给 讲解下 谢谢!

9 个解决方案

#1


把一个数分解成为2进制。。。表示
比如 10 就是 1010
分解算法为:
           10 % 2 = 0
10 / 2 = 5
           5 % 2 = 1
5 / 2 = 2  
           2 % 2 = 0
2 / 2 = 1
           1 % 2 = 1
1 < 2  递归停止。。 

然后反向打印 上面的 0101 => 1010 这就是10的2进制值

#2


该函数的功能是将一个数字按照二进制格式打印出来

#3


“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

#4


void to_binary (unsigned long n)
{

 int r;
 r = n % 2;
 if (n >= 2)
 to_binary (n / 2);
 putchar ('0' + r);
}
是实现将就参数n的二进制以字符形式输出。
比如参数n是5,就输出101;具体实现中to_binary 共被调用了3次。每级变量都会创建变量n;直到n<2结束递归,执行putchar ('0' + r),输出1,并返回到上一级递归输出0,再返回上一级递归输出1。

还有你黑色的代码好多错误.

#5


如果n大于2  那么就用n除2作为参数继续调用本函数  如果n除2再除2还是大于2继续调用下去  直到n小于2再一层一层退出

#6


函数运行的过程中的中间结果保存在栈中,这样说吧,假设n=10;
第一次执行完之后堆栈的内容是,
r=0       n/2=5
第二次执行完后是
r=1       n/2=2.500

r=0       n/2=5
第三次执行完是

r=0.500   n/2=1.25
r=1       n/2=2.500

r=0       n/2=5

然后不满足if的条件函数返回,变量从上到下边,从堆栈中销毁

然后就返回,,建议你看一下pointers on  c的130页

#7


想不明白的时候就用特例来理一理逻辑
比如 n = 100
第一次调用 to_binary(100) 判断 n>=2,递归
第二次调用 to_binary(50) 还是 n>=2,继续递归
...
第 6 次调用 to_binary(3) 继续递归
第 7 次调用 to-binary(1),此时 n<2, 打印余数

原理就是 十进制边二进制 采用 除2取余法。

#8


本论坛找 “赵老师经典回帖”

#9


引用 8 楼  的回复:
本论坛找 “赵老师经典回帖”

“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

#1


把一个数分解成为2进制。。。表示
比如 10 就是 1010
分解算法为:
           10 % 2 = 0
10 / 2 = 5
           5 % 2 = 1
5 / 2 = 2  
           2 % 2 = 0
2 / 2 = 1
           1 % 2 = 1
1 < 2  递归停止。。 

然后反向打印 上面的 0101 => 1010 这就是10的2进制值

#2


该函数的功能是将一个数字按照二进制格式打印出来

#3


“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

#4


void to_binary (unsigned long n)
{

 int r;
 r = n % 2;
 if (n >= 2)
 to_binary (n / 2);
 putchar ('0' + r);
}
是实现将就参数n的二进制以字符形式输出。
比如参数n是5,就输出101;具体实现中to_binary 共被调用了3次。每级变量都会创建变量n;直到n<2结束递归,执行putchar ('0' + r),输出1,并返回到上一级递归输出0,再返回上一级递归输出1。

还有你黑色的代码好多错误.

#5


如果n大于2  那么就用n除2作为参数继续调用本函数  如果n除2再除2还是大于2继续调用下去  直到n小于2再一层一层退出

#6


函数运行的过程中的中间结果保存在栈中,这样说吧,假设n=10;
第一次执行完之后堆栈的内容是,
r=0       n/2=5
第二次执行完后是
r=1       n/2=2.500

r=0       n/2=5
第三次执行完是

r=0.500   n/2=1.25
r=1       n/2=2.500

r=0       n/2=5

然后不满足if的条件函数返回,变量从上到下边,从堆栈中销毁

然后就返回,,建议你看一下pointers on  c的130页

#7


想不明白的时候就用特例来理一理逻辑
比如 n = 100
第一次调用 to_binary(100) 判断 n>=2,递归
第二次调用 to_binary(50) 还是 n>=2,继续递归
...
第 6 次调用 to_binary(3) 继续递归
第 7 次调用 to-binary(1),此时 n<2, 打印余数

原理就是 十进制边二进制 采用 除2取余法。

#8


本论坛找 “赵老师经典回帖”

#9


引用 8 楼  的回复:
本论坛找 “赵老师经典回帖”

“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出