递归问题 2

xkyylly 2003-10-15 11:19:39
long power( long, long );

int main()
{
long b, e;

cout << "Enter a base and an exponent: ";
cin >> b >> e;
cout << b << " raised to the " << e << " is "
<< power( b, e ) << endl;

return 0;
}

long power( long base, long exponent )
{
return exponent == 1 ? base : base * power( base, exponent - 1 );
}


最后那句, base * power( base, exponent - 1 ); 不太明白

哪位给讲解一下? 谢过啦…………
...全文
31 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xkyylly 2003-10-16
  • 打赏
  • 举报
回复
昏死,又不明白了, 我知道是一个乘幂函数啊。递归而已。
base的exponent次幂。

但为什么会以那样得格式出现?
( base, exponent - 1 ) 为什么以这样得格式表示 的base exponent - 1次幂?
xkyylly 2003-10-16
  • 打赏
  • 举报
回复
哦, 那就明白了, 谢谢那么多位了…………
TianGuangZao 2003-10-16
  • 打赏
  • 举报
回复
YES.
你可以考虑简单些的情况:
power(2, 2)
base=2, exponent=2

有递归函数:
long power( long base, long exponent )
{
return exponent == 1 ? base : base * power( base, exponent - 1 );
}

取条件运算符冒号右边表达式: 2 * power( base, 1)
显然要先计算 power( base, 1) 的值。
在这里有个动作,先保护本次函数的现场,如自动变量进栈,记录调用位置等等;
然后调用自身 power( base, 1),计算完毕后,返回计算结果到调用函数,很显然这里是 2;
这时候调用函数的相关变量出栈,恢复现场,这样的话,在调用点位置,即 2 * power( base, 1) = 2 * 2 = 4。
从而实现了乘幂,这就是递归思想。
sofp 2003-10-16
  • 打赏
  • 举报
回复
是的,而且base的值一直没有变,只有exponent在变.
xkyylly 2003-10-16
  • 打赏
  • 举报
回复
开始还挺明白的, 一和这个比较,就一头雾水了

return number * factorial( number - 1 );
TianGuangZao 2003-10-16
  • 打赏
  • 举报
回复
递归的思想就是每一次递归调用,得到一个原来版本的简化版本,使问题变的更简单。
base 一直没变。
不过你仔细分析一下,每个调用函数的 exponent 都比前一个小,一直到出现power( base, 1 ),从该点开始回溯。

如果你还没看懂,就不该讲“递归而已”,因为你更本没有理解本质,只是表面模模糊糊的一些感觉。
xkyylly 2003-10-15
  • 打赏
  • 举报
回复
那么括号中得 base 是不是 等于括号外得base ?
马大哈昆 2003-10-15
  • 打赏
  • 举报
回复
最后那句, base * power( base, exponent - 1 ); 不太明白

递归调用,因为当exponnent!=1 时,要返回base * power( base, exponent - 1 ),所以要继续求 power( base, exponent - 1 ),完成一次递归,直到exponent=1,次时return的是base的exponent次幂了。

Leung_(Mooner) 已经解释的很清楚了。
马大哈昆 2003-10-15
  • 打赏
  • 举报
回复
一个乘幂函数啊。递归而已。
base的exponent次幂。
langzi8818 2003-10-15
  • 打赏
  • 举报
回复
差不多了,我觉得和阶乘很象,不知道干什么用的!
楼主明白了吗?
bosedom 2003-10-15
  • 打赏
  • 举报
回复
同一楼上的。感觉有点像求阶乘的算法。
Leung_ 2003-10-15
  • 打赏
  • 举报
回复
举个例子,设:
b = 2, c = 3

那么:
power(2,3) --> 2 * power(2, 2) --> 2 * 2 * power( 2, 1) --> 2 * 2 * 2

明白了没有?

xkyylly 2003-10-15
  • 打赏
  • 举报
回复
我没有学到 指针才,
bosedom 2003-10-15
  • 打赏
  • 举报
回复
base是个long的变量,*是不是乘号啊? 就是判断base和base * power(base,exponent-1)的值的真假来决定return值。你是不是认为*指针啊?
darcymei 2003-10-15
  • 打赏
  • 举报
回复
写错了吧!
求base的exponent次幂
exponent应该是int型把

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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